Вверх ↑
Ответов: 691
Рейтинг: 7
#1: 2019-01-08 00:00:04 ЛС | профиль | цитата
Оптимизирую "джунгли" по новым "понятиям" о потоках. Стало уже стабильнее. Но разбираясь с примером выше, обнаружил что идет работа вообще без мьютексов. И обратился к штатному примеру, вспомнить как его вообще применять. Так получается что выводить в оконные элементы можно из параллельного потока прямо по onExec? Да и читать данные из того же Text тоже можно в параллельном потоке? Считал что обращаться к оконным элементам из параллельного вообще нельзя, только через синхронизированные с главным потоком события. Может есть что почитать на эту тему применимо к HiAsm?

Штатную схему прикрепляю.

Add(MainForm,14017285,70,133)
{
Left=20
Top=105
Width=424
Height=79
Caption=""
link(onCreate,7461548:doEvent1,[])
}
Add(InfoTip,16646216,329,91)
{
Info=#15:Защищаем ресурс|0:|0:|0:|0:|0:|0:|0:|42:По окончанию работы освобождаем для других|
Width=141
Height=137
}
Add(For,9010111,532,168)
{
End=100000
IncludeEnd=1
link(onEvent,3731085:doEvent1,[])
link(onStop,6614406:doOff,[(578,181)(578,114)(520,114)(520,132)])
}
Add(Edit,13816107,679,168)
{
Left=10
Top=13
Width=95
Text=""
}
Add(Hub,3731085,588,168)
{
link(onEvent1,13816107:doText,[])
link(onEvent2,15914761:doWork2,[])
}
Add(Application,1559756,637,175)
{
Wait=1
}
Add(Thread,4910251,175,147)
{
Delay=300
FastStop=0
link(onExec,6962201:doEvent1,[])
}
Add(Hub,10901672,497,154)
{
OutCount=3
link(onEvent1,6614406:doOn,[(521,160)(521,139)])
link(onEvent2,15914761:doWork1,[(620,167)])
link(onEvent3,9010111:doFor,[])
}
Add(LED,6614406,532,119)
{
Left=260
Top=10
ColorOn=65280
ColorOff=32768
ColorBlick=65280
}
Add(HubEx,15914761,616,175)
{
link(onEvent,1559756:doProcessMessages,[])
}
Add(Hub,3835869,119,315)
{
OutCount=3
link(onEvent1,14120473:doChangeValue,[(147,321)(147,244)])
link(onEvent2,15271927:doEvent1,[])
link(onEvent3,5233333:doChangeValue,[(147,335)(147,440)])
}
Add(LED,5233333,217,434)
{
Left=340
Top=10
ColorOn=16776960
ColorOff=8421376
ColorBlick=16776960
}
Add(InfoTip,8429069,154,98)
{
Info=#50:Запускаем работу с ресурсом в параллельном потоке |
Width=155
Height=102
}
Add(InfoTip,1151692,154,399)
{
Info=#31:Делаем чего-то, никому не мешая|
Width=155
Height=81
}
Add(InfoTip,10690651,154,287)
{
Info=#52:Пытаемся запустить работу с ресурсом в другом потоке|0:|0:|0:|0:|48:Доступ откроется тогда, когда освободится ресурс|
Width=155
Height=109
}
Add(LED,14120473,217,238)
{
Left=380
Top=10
ColorOn=65535
ColorOff=32896
ColorBlick=65535
Value=0
}
Add(InfoTip,9292949,154,203)
{
Info=#31:Делаем чего-то, никому не мешая|
Width=155
Height=81
}
Add(InfoTip,11626540,483,91)
{
Info=#23:Тут работаем с ресурсом|
Width=239
Height=137
}
Add(SafeMode,14966444,385,154)
{
WaitMode=1
link(onSafeMode,10901672:doEvent1,[])
}
Add(Hub,15271927,231,322)
{
OutCount=3
link(onEvent1,10327193:doData,[])
link(onEvent2,882968:doOn,[(318,335)(318,251)])
link(onEvent3,1357669:doSafeMode,[])
}
Add(Switch,882968,595,231)
{
DataOn=Integer(1)
DataOff=Integer(0)
Point(doOn)
Point(State)
}
Add(DoData,10327193,679,322)
{
Data=String(Попытка доступа к ресурсу)
link(onEventData,6231889:doWork3,[(732,328)])
}
Add(IndexToChanel,11574106,595,273)
{
Point(Index)
link(onEvent2,8910723:doData,[])
link(Index,882968:State,[])
}
Add(LED,8001298,679,357)
{
Left=300
Top=10
ColorBlick=255
}
Add(DoData,8910723,679,280)
{
Data=String(Ресурс открыт для другого потока)
link(onEventData,6231889:doWork2,[])
}
Add(HubEx,6231889,728,280)
{
Angle=3
link(onEvent,13823805:doWork2,[(732,69)])
}
Add(DoData,7263705,266,126)
{
Data=String(Работает параллельный поток)
link(onEventData,13823805:doWork3,[(319,132)])
}
Add(Hub,6962201,224,147)
{
link(onEvent1,7263705:doData,[(252,153)(252,132)])
link(onEvent2,14966444:doSafeMode,[])
}
Add(HubEx,13823805,315,63)
{
Angle=2
link(onEvent,14017285:doCaption,[(58,69)(58,139)])
}
Add(Hub,3917072,560,371)
{
link(onEvent1,8001298:doOn,[])
link(onEvent2,8922034:doTimer,[])
}
Add(Timer,8922034,595,378)
{
Interval=500
Enable=1
AutoStop=1
link(onTimer,8001298:doOff,[(653,384)(653,370)])
}
Add(Edit,3456976,595,420)
{
Left=110
Top=13
Width=95
Text=""
}
Add(DoData,7394771,532,420)
{
link(onEventData,3456976:doText,[])
link(Data,9010111:Position,[])
}
Add(SafeMode,1357669,385,336)
{
WaitMode=1
link(onSafeMode,13329192:doEvent1,[])
}
Add(Hub,13329192,490,336)
{
OutCount=3
link(onEvent1,11574106:doEvent,[(521,342)(521,279)])
link(onEvent2,7394771:doData,[(521,349)(521,426)])
link(onEvent3,16319066:doNext,[(514,356)(514,475)])
}
Add(Hub,7461548,119,147)
{
link(onEvent1,4910251:doStart,[])
link(onEvent2,16126828:doStart,[(143,160)(143,191)(58,191)(58,321)])
}
Add(Thread,16126828,70,315)
{
link(onExec,3835869:doEvent1,[])
link(onSyncExec,3917072:doEvent1,[(113,328)(113,377)])
}
Add(Edit,5685232,595,469)
{
Left=210
Top=13
Width=45
Text="0"
}
Add(Counter,16319066,532,469)
{
link(onNext,5685232:doText,[])
}
Add(InfoTip,16687612,336,280)
{
Info=#31:Дожидаемся освобождения ресурса|
Width=141
Height=137
}

карма: 0

0