Четыре дня я не писал новых статей, и за это время вы, читатели, наверняка уже прочитали все статьи, если не успели сделать этого раньше.
А сейчас я порадую вас новой статьёй о 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 и во всём разберётесь. А напоследок покажу передачу в многомерном потоке разных типов данных.
Первый элемент - строка, второй - картинка. Строка устанавливается в заголовк формы, а картинка сначала преобразуется в иконку, а потом устанавливается как иконка программы (конечно, сам значокв проводнике не меняется, но в заголовке на время этого запуска иконка меняется). О работе с иконками и другой графикой подробно я рассказывал здесь.
четверг, 1 октября 2009 г.
Подписаться на:
Комментарии к сообщению (Atom)
Да, лихая технология для храбрых портняжек: одним махом семерых побивахом ;0)
ОтветитьУдалитьКстати, и в работе со связями в схемах тоже можно вставлять компоненты через контекстное меню (правой кнопкой мыши) - тоже многомерность, экономящая время и силы.
Вопрос: а что такое узел на связи и как с ним работать?
Узел - это расширенный разветвитель. Если подвести к нему мышь, то можно увидеть три точки методов и одну - события. Изменять число точек у него нельзя. Конечно, это неудобно по сравнению с обычным разветвителем, но зато этот занимает мало места. Впрочем, я предпочитаю всё же обычный разветвитель.
ОтветитьУдалитьВторая схема:
ОтветитьУдалитьhttp://hi-asm.narod.ru/sha/bh18.sha
не доступна
Пример с массивом http://hi-asm.narod.ru/sha/bh191.sha выдает пустые сообщения.
ОтветитьУдалить"http://hi-asm.narod.ru/sha/bh18.sha" - исправлено.
ОтветитьУдалить"http://hi-asm.narod.ru/sha/bh191.sha" - сначала нужно забить в строку текст, нажать Enter, а потом уже смотреть сообщения.
Админ я тут пытался написать прогу отправка МТ через TCP\IP но что то не как не могу понять почему не работает как можно ее вам отправить.
ОтветитьУдалитьМой адрес capiton.82@mail.ru
Можете загрузить на фаилообменник и оставить здесь ссылку (например, ifolder.ru).
ОтветитьУдалитьПроще будет отправить на маил. Быстрее наверное будет.
ОтветитьУдалитьссылка на файлы http://ifolder.ru/20145165
ОтветитьУдалитьЛучше, наверное, MT-технологию не использовать для отправки через этот компонент, потому что неизвестно, в каком формате отправлять данные. На вкладке "Файлы" есть компоненты SreamPack и StreamUnpack, которые выполняют примерно ту же роль, что и MT, но на выходе выдают полноценный файловый поток (stream). А такой тип уже можно отправить через TCP/IP.
ОтветитьУдалитьКлиент
Сервер
Спасибо Большое Я ваш поклонник. Вы молодец админ. Я бы с удовольствием поболтал с вами в живую. Если что мой майл выше.
ОтветитьУдалить