Вверх ↑
HiAsm4 - Технология MultiThread

Технология MultiThread
Что такое MultiThread
   MultiThread (многомерный поток) - это технология, которая позволяет передавать в потоке между элементами более чем один тип данных за раз (за один вызов). Часто используется сокращенное название технологии - МТ.
Особенности работы
   Рассмотрим особенности работы с МТ потоками в схемах HiAsm на простом примере программы, выводящей текстовое сообщение после нажатия кнопки. Вот код этой схемы
Add(Button,10538079,105,70)
{
Left=125
Top=65
Data=String(Hello world)
link(onClick,7435671:doMessage,[])
}
Add(Message,7435671,175,70)
{
Caption="test message"
}
Напомню, как работает данная схема и что в ней происходит после нажатия кнопки:
- компонент Button получает от ОС сигнал о нажатии кнопки на форме, после чего вызывает событие onClick с передачей в поток данных из св-ва Data
- компонент Message принимает этот поток в своем методе doMessage и выводит полученный текст на экран, причем данные из потока попадают именно в св-во Message потому, что оно не задано по умолчанию и соответствующая ему точка ни с чем не соединена.
Это классическая демонстрация работы одномерного потока, данные из которого либо не используются никак, либо попадают в одно (и только одно!) не определенное никак св-во.

   Теперь предположим нам захотелось у Message оба св-ва принять от других элементов, а не использовать значения, заданные по-умолчанию на этапе проектирования схемы. Как быть в этом случае? Очевидно можно одно из св-тв по прежнему передать потоком, а второе через Data точку связать с другим элементом. Например так:

Add(Button,10538079,105,70)
{
Left=125
Top=65
Data=String(Hello world)
link(onClick,7435671:doMessage,[])
}
Add(Message,7435671,175,70)
{
link(Caption,16671485:Text,[])
}
Add(Edit,16671485,182,7)
{
Left=125
Top=30
Width=105
Text="Message caption"
}
Это выход из ситуации, если количество передаваемых элементу данных не так велико и элементы расположены на одном уровне вложенности. Но как быть, если точек много, а элементы расположены друг от друга достаточно далеко по вложенности в контейнерах? Протаскивать через все уровни десяток связей? Но тогда контейнеры раздуются до таких размеров, что дальнейшее сопровождение схемы станет неудобным и нечитаемым. Именно для таких случаев и были придуманы и внедрены многомерные потоки, которые позволяют значительно сократить количество связей в схеме за счет передачи по одному линку (линии связи) большого количества разнотипных данных.
   Для управления МТ потоком существует целая вкладка элементов с соответствующим названием. Она позволяет добавлять данные в МТ поток, извлекать их обратно, конвертировать в обычные массивы или строки (и обратно) и многое другое (для подробностей смотрите справку по элементам данной вкладки). Мы же в данный момент рассмотрим простейший пример создания МТ потока для вывода сообщения на экран с заголовком и текстом, переданными нами в потоке. Для этого изменим схему выше следующим образом:

Add(Button,10538079,231,126)
{
Left=125
Top=65
Data=String(Hello world)
link(onClick,4446263:doAdd,[])
}
Add(Message,7435671,427,126)
{
}
Add(Edit,16671485,308,63)
{
Left=125
Top=30
Width=105
Text="Message caption"
}
Add(MT_Add,4446263,308,126)
{
link(onAdd,7435671:doMessage,[])
link(Data,16671485:Text,[])
}
Add(InfoTip,13604729,217,49)
{
Info=#6:Sender|
Width=141
Height=116
}
Add(InfoTip,12087651,385,49)
{
Info=#8:Receiver|
Width=141
Height=116
}
Теперь от блока с именем Sender к блоку с именем Receiver тянется всего одна связь, а не две как это было в предыдущем примере. Очевидно, что в данном конкретном случае использование МТ потока носит чисто демонстрационный характер и никаких преимуществ не дает. Важно так же понять каким образом и в каком порядке данные из МТ потока используются в качестве св-тв элемента. В принципе отличия от одномерного потока нет никакого с той лишь разницей, что для неопределенных св-тв элемента данные из потока используются не единожды, а звено за звеном (в порядке добавления в поток). Например, в предыдущей схеме первое звено МТ потока попало в свойство Message, а второе в свойство Caption в соответствие с порядком их следования в конфигурационном файле компонента.



   Еще один достаточно простой пример для пояснения методики работы МТ потоков

Add(MainForm,2953706,462,126)
{
}
Add(Button,10538079,224,126)
{
Left=125
Top=65
Data=String(Hello world)
link(onClick,4446263:doAdd,[])
}
Add(Edit,16671485,273,63)
{
Left=125
Top=30
Width=105
Text="item1"
}
Add(MT_Add,4446263,273,126)
{
link(onAdd,31050:doAdd,[])
link(Data,16671485:Text,[])
}
Add(InfoTip,13604729,217,49)
{
Info=#6:Sender|
Width=148
Height=116
}
Add(InfoTip,12087651,385,49)
{
Info=#8:Receiver|
Width=141
Height=116
}
Add(FormatStr,2158637,406,126)
{
DataCount=3
Mask="%1 %2 - %3"
link(onFString,2953706:doCaption,[])
}
Add(Edit,14733261,322,63)
{
Left=240
Top=30
Width=105
Text="item2"
}
Add(MT_Add,31050,322,126)
{
link(onAdd,2158637:doString,[])
link(Data,14733261:Text,[])
}
Тут в секции Sender создается МТ из 3х звеньев, которые передаются на вход элемента FormatStr и последовательно вставляются в строку по указанной маске. Попробуйте теперь изменить FormatStr вот таким образом
Add(FormatStr,2158637,406,126)
{
DataCount=4
Mask="%1 %2 - %3 %4"
}
и посмотреть работу примера с этой модификацией. Как можно увидеть, вместо четвертого элемента вставляется пустота, т.к. звеньев в МТ потоке всего три, а каждое звено может использоваться только один раз (так же и данные в одномерном потоке могут использоваться только один раз).
BB-code статьи для вставки
Всего комментариев: 0
(комментарии к статье еще не добавлены)
Комментарий
...