четверг, 1 октября 2009 г.

Технология MultiThread в HiAsm

Четыре дня я не писал новых статей, и за это время вы, читатели, наверняка уже прочитали все статьи, если не успели сделать этого раньше.
А сейчас я порадую вас новой статьёй о HiAsm, в которой, конечно же, будет практика и объяснения.
Сейчас я расскажу вам важнейшие технологии HiAsm, как MultiThread, или MT-потоки.

Эта технология позволяет передавать несколько данных в одном потоке. Ведь один метод для работы может потребовать несколько данных, а в обычном потоке можно передать только одни данные, другие же придётся передавать через верхние точки. Это не всегда удобно, и альтернативный способ очень пригодится.

Компоненты для использования технологии MultiThread в HiAsm находятся на вкладке HiAsm "MT-потоки". Возьмём самый первый компонент - MT_Add. Он добавляет элемент в многомерный поток. Один такой компонент может добавлять только один элемент. А если нужно добавить ещё - ставьте новые копии MT_Add.

Следующий компонент - MT_Get. Он получает данные из многомерного потока по элементам. Сначала выдаются первые данные, потом - вторые и так далее. И сразу рассмотрим небольшой пример.



При нажатии кнопки первый компонент HiAsm - MT_Add - берёт данные с верхней точки, из компонента Memory. По событию компонент onAdd выдаются в поток многомерные данные, содержащие пока только один элемент

Они поступают на метод следующего компонент MT_Add, и к ним присоединяются следующие данные, полученные из поля ввода. А откуда берёт данные третий компонент MT_Add? Он берёт их из параметра Data. Ведь если не задействована верхняя точка, то данные берутся из параметра.

А дальше идут компоненты MT_Get. Каждый из них получает по одному элементу. Всего добавлено три элемента, вот у нас и получилось три компонента MT_Get. Первый извлекает первые данные, второй - вторые и т. д. Проверьте сами работу программы.

Ну а прямое назначение многомерного потока смотрите в следующем коде.



Сообщение здесь получает сразу и заголовок, и текст. А если бы мы пользовались простым потоком, то пришлось бы что-то из этого передавать на верхнюю точку. Конечно, иногда это бывает удобно, но в более сложных случаях приходится пользоваться многомерными потоками, тем более что HiAsm всё активнее использует эту технологию.

Теперь зададимся вопросом, а что если нужно добавить много данных в многомерный поток. Нам придётся ставить много компонентов MT_Add. Это неудобно, и для решения этой проблемы существует компонент HiAsm - MT_AddData. Этот компонент HiAsm позволяет добавить сразу несколько элементов в многомерный поток.



Количество верхних точек управлется параметром компонента Count. Можно задать до 100 точек. И результат этой схемы такой же, как и предыдущей.

Но если в HiAsm есть компонент для добавления сразу несокльких элементов в MT-поток, то должен быть и для добычи сразу нескольких. Таких компонента целых два: MT_MultiMem и MT_MultiData. Первый из низ них раскладывает многомерный поток на элементы, получить которые можно с нижних точек (их количество также можно менять). Второй при получении каждого элемента генерирует событие, в потоке которого (обычном потоке!) выдаёт этот элемент.



В этой схеме HiAsm запоминаются три элемента в многомерный поток, а он затем выдаётся на разветвитель и попадает сначала в компонент MT_MultiData, а потом - MT_MultiMem.

Поскольку элемента три, то и события у MT_MultiData мы сделали три. Первый элемент выдаётся в надпись, второй - в поле ввода, а третий - устанавливается как заголовок окна программы.

Компонент HiAsm'а MT_MultiMem после разложения потока генерируется событие onData, которое вызывает последовательно три сообщения. Тексты каждого из них определяются элементами многомерного потока.

Ну а если каждый элемент многомерного потока задаётся через поле ввода. Не делать же для 100 элементов 100 полей ввода! Нужно обойтись одним полем ввода, а каждое значение просто добавлять в массив, с которым будет работать компонент MT_Array. В нём каждый элемент многомерного потока хранится как в массиве. И потому работать с многомерным потоком можно как с массивом элементов.



С помощью обычного компонента HiAsm'а ArrayRW в компонент MT_Array добавляются новые элементы. Однао это только их массим, а не многомерный поток. Многомерный поток из этих элементов можно считать с точки MThread нашего массива. А компонент MT_Add забирается в себя этот поток и передаёт его компоненту Message, которое выводит заголовк и текст из первых двух элементов (остальные роли не играют).

Для получения многмерного потока с верхней точки и передачи его в поток не используйте компонент DoData, а только MT_Add! Следующий способ неверен и не даст нужный результат.



Осталось лишь рассмотреть ещё один важный компонент HiAsm-технологии MultiThread. Это MT_String. Если многомерный поток состоит только из строк, то этот компонент позволяет составить одну строку из него, элементы которой будут разделены символами, указанными в параметре Delimeter. По умолчанию это точка с запятой. А также этот компонент преобразовывает строку, разделённую выбранным символом, в многомерный поток.



Если вы будете работать с этими компонентами, то постепенно вникнете в эту технологию HiAsm и во всём разберётесь. А напоследок покажу передачу в многомерном потоке разных типов данных.



Первый элемент - строка, второй - картинка. Строка устанавливается в заголовк формы, а картинка сначала преобразуется в иконку, а потом устанавливается как иконка программы (конечно, сам значокв проводнике не меняется, но в заголовке на время этого запуска иконка меняется). О работе с иконками и другой графикой подробно я рассказывал здесь.

11 коммент.:

  1. Да, лихая технология для храбрых портняжек: одним махом семерых побивахом ;0)
    Кстати, и в работе со связями в схемах тоже можно вставлять компоненты через контекстное меню (правой кнопкой мыши) - тоже многомерность, экономящая время и силы.
    Вопрос: а что такое узел на связи и как с ним работать?

    ОтветитьУдалить
  2. Узел - это расширенный разветвитель. Если подвести к нему мышь, то можно увидеть три точки методов и одну - события. Изменять число точек у него нельзя. Конечно, это неудобно по сравнению с обычным разветвителем, но зато этот занимает мало места. Впрочем, я предпочитаю всё же обычный разветвитель.

    ОтветитьУдалить
  3. Вторая схема:
    http://hi-asm.narod.ru/sha/bh18.sha
    не доступна

    ОтветитьУдалить
  4. Пример с массивом http://hi-asm.narod.ru/sha/bh191.sha выдает пустые сообщения.

    ОтветитьУдалить
  5. "http://hi-asm.narod.ru/sha/bh18.sha" - исправлено.

    "http://hi-asm.narod.ru/sha/bh191.sha" - сначала нужно забить в строку текст, нажать Enter, а потом уже смотреть сообщения.

    ОтветитьУдалить
  6. Админ я тут пытался написать прогу отправка МТ через TCP\IP но что то не как не могу понять почему не работает как можно ее вам отправить.
    Мой адрес capiton.82@mail.ru

    ОтветитьУдалить
  7. Можете загрузить на фаилообменник и оставить здесь ссылку (например, ifolder.ru).

    ОтветитьУдалить
  8. Проще будет отправить на маил. Быстрее наверное будет.

    ОтветитьУдалить
  9. ссылка на файлы http://ifolder.ru/20145165

    ОтветитьУдалить
  10. Лучше, наверное, MT-технологию не использовать для отправки через этот компонент, потому что неизвестно, в каком формате отправлять данные. На вкладке "Файлы" есть компоненты SreamPack и StreamUnpack, которые выполняют примерно ту же роль, что и MT, но на выходе выдают полноценный файловый поток (stream). А такой тип уже можно отправить через TCP/IP.

    Клиент
    Сервер

    ОтветитьУдалить
  11. Спасибо Большое Я ваш поклонник. Вы молодец админ. Я бы с удовольствием поболтал с вами в живую. Если что мой майл выше.

    ОтветитьУдалить