| Потоки | - SafeMode |
SafeMode
Краткое описание
Компонент предназначен для исключения одновременной работы определённых участков кода разных потоков одним из двух способов: локальным (блокировка дейстует только в пределах запущенного приложения) и глобальным (действует на все приложения в системе).
Параметры
Методы
События
Пример
Пример использования компонента SafeMode в режиме Local (критической секции кода) для защиты данных и программы от ошибок:
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
}
Замечания
Применение элемента имеет смысл только в многопоточных схемах (рекомендуемый режим - Local) или двух и более копиях одного и того же приложения (Global). Участок кода, следующий после события onSafeMode (SafeMode с определёнными Name и Mode) будет выполнен только при условии, что в любом другом потоке (Mode=Local) или приложении (Mode=Global) параллельно не исполняется участок, запущенный через SafeMode с такими же параметрами Name и Mode.
В режиме WaitMode=Wait SafeMode повторяет попытки выполнить защищённый им код, но тратит больше ресурсов системы, а режиме NoWait SafeMode прекращает эти попытки при первой же неудаче. Таким образом, выполнение обязательных операций целесообразно доверять отдельному потоку, использующему SafeMode с WaitMode=Wait. Для основного потока приложения это чревато "подвисаниями" на SafeMode.
Обновление элемента: [svn]SafeMode.pas[/svn]
В режиме WaitMode=Wait SafeMode повторяет попытки выполнить защищённый им код, но тратит больше ресурсов системы, а режиме NoWait SafeMode прекращает эти попытки при первой же неудаче. Таким образом, выполнение обязательных операций целесообразно доверять отдельному потоку, использующему SafeMode с WaitMode=Wait. Для основного потока приложения это чревато "подвисаниями" на SafeMode.
Обновление элемента: [svn]SafeMode.pas[/svn]
BB-code статьи для вставки
Всего комментариев: 0
(комментарии к статье еще не добавлены)