Вверх ↑
Пакеты 
HiAsm4
Windows 
Компоненты 
Cиcтeмa 
Потоки - SafeMode

SafeMode
Краткое описание
   Компонент предназначен для исключения одновременной работы определённых участков кода разных потоков одним из двух способов: локальным (блокировка дейстует только в пределах запущенного приложения) и глобальным (действует на все приложения в системе).
Параметры
  • Name - Имя защитного мьютекса или критической секции
  • Mode - Режим защиты. Global - защита мьютексом, Local - защита критической секцией
  • Wait_Abandoned - Освобождать мьютекс при несанкционированном завершении потока
  • WaitMode - Режим ожидания. Wait - Ожидать освобождения ресурса. NoWait - Немедленно вернуть управление
  • Методы
  • doSafeMode - Запускает работу с ресурсом и включает защиту
  • События
  • onSafeMode - Событие для запуска работы с ресурсом
  • Пример
    Пример использования компонента 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]
    BB-code статьи для вставки
    Всего комментариев: 0
    (комментарии к статье еще не добавлены)
    Комментарий
    ...