Вверх ↑
Разработчик
Ответов: 26135
Рейтинг: 2126
#1: 2012-04-03 17:00:13 ЛС | профиль | цитата
Все вы знаете ситуацию, когда контейнер невозможно удалить из своего события и для этого ставиться таймер с маленкой задержкой. Происходит это по причине того, что удаление происходит из своего же незаконченного метода, а таймер разделяет очереди обработчика, тк его событие происходит уже в другой очереди, когда все предыдущие события уже закончены. Но создание большого количества таймеров в системе не очень хорошая идея. Для этих целей и был разработан компонент OtherQueueEvent (заменено на DeferredEvent (отложенное событие)), который позволяет выдавать событие из другой, специально созданной на момент обработки события, очереди сообщений системы, что освобождает от применения большого количества таймеров для целей разделения событий по времени

Везде, где вы раньше применяли таймера для выдачи событий из другой очереди применяйте компонент OtherQueueEvent (заменено на DeferredEvent (отложенное событие)) вместо таймера. Кроме того, элемент позволяет транслировать через себя данные

Компонент вы можете найти на SVN. При установке будет проситься во вкладку Controls (переведено во вкладку System)

Внимание! Имя компонента заменено на DeferredEvent (отложенное событие)

Пример, наглядно показывающий крэш программы при попытки удаления сз своего же события (верхняя часть), и применение DeferredEvent для разделений событий по времени вместо таймера (нижняя часть)



Add(MainForm,6208649,196,189)
{
Width=262
Height=228
Position=1
}
Add(Button,4244657,196,238)
{
Left=10
Top=40
TabOrder=-1
link(onClick,9260267:##add,[])
}
Add(Button,9979880,196,273)
{
Left=10
Top=65
TabOrder=-1
link(onClick,9260267:doDelete,[(254,279)(254,251)])
}
Add(MultiElementEx,13664646,280,378)
{
link(onResult,14628342:doValue,[])
link(onDelete,15487727:doData,[(331,391)(331,454)])
link(Op1,10884471:Var1,[(286,366)(321,366)(321,429)])
}
BEGIN_SDK
Add(EditMultiEx,12370993,21,21)
{
WorkCount=#5:##add|8:doDelete|7:##clear|
EventCount=#8:onResult|8:onDelete|
DataCount=#3:Op1|
Point(##add)
Point(##clear)
link(##add,14089078:doTimer,[(70,27)(70,48)])
link(doDelete,8262538:doEvent1,[(42,34)(42,97)])
}
Add(Math,9128440,231,42)
{
Op2=1
link(onResult,12370993:onResult,[(285,48)(285,27)])
link(Op1,12370993:Op1,[(237,32)(27,32)])
}
Add(Hub,8262538,63,91)
{
link(onEvent1,14089078:doStop,[(98,97)(98,55)])
link(onEvent2,12370993:onDelete,[(294,104)(294,34)])
}
Add(Timer,14089078,119,42)
{
Interval=15
Enable=1
link(onTimer,9128440:doOperation,[])
}
END_SDK
Add(Memory,14628342,350,378)
{
link(onData,6622035:doText,[])
}
Add(Label,6622035,399,378)
{
Left=10
Top=100
}
Add(Button,1463480,196,378)
{
Left=10
Top=120
TabOrder=-1
link(onClick,13664646:##add,[])
}
Add(Button,5614741,196,413)
{
Left=10
Top=145
TabOrder=-1
link(onClick,13664646:doDelete,[(254,419)(254,391)])
}
Add(MultiElementEx,9260267,280,238)
{
link(onResult,5960612:doValue,[])
link(onDelete,9260267:##clear,[(332,251)(332,285)(268,285)(268,258)])
link(Op1,5960612:Value,[(286,226)(321,226)(321,289)(356,289)])
}
BEGIN_SDK
Add(EditMultiEx,11371213,21,21)
{
WorkCount=#5:##add|8:doDelete|7:##clear|
EventCount=#8:onResult|8:onDelete|
DataCount=#3:Op1|
Point(##add)
Point(##clear)
link(##add,7498319:doTimer,[(70,27)(70,48)])
link(doDelete,13853942:doEvent1,[(42,34)(42,97)])
}
Add(Math,8716678,231,42)
{
Op2=1
link(onResult,11371213:onResult,[(285,48)(285,27)])
link(Op1,11371213:Op1,[(237,32)(27,32)])
}
Add(Hub,13853942,63,91)
{
link(onEvent1,7498319:doStop,[(98,97)(98,55)])
link(onEvent2,11371213:onDelete,[(294,104)(294,34)])
}
Add(Timer,7498319,119,42)
{
Interval=15
Enable=1
link(onTimer,8716678:doOperation,[])
}
END_SDK
Add(Memory,5960612,350,238)
{
link(onData,10891551:doText,[])
}
Add(Label,10891551,399,238)
{
Left=10
Top=20
}
Add(DeferredEvent,12154801,399,448)
{
InData=0
link(onDeferredEvent,6227579:doEvent1,[])
}
Add(DoData,15487727,350,448)
{
Data=Integer(5)
link(onEventData,12154801:doDeferredEvent,[])
link(Data,10884471:Var2,[])
}
Add(Edit,8220547,490,448)
{
Left=80
Top=145
Width=120
Cursor=1
Text=""
}
Add(Hub,6227579,441,448)
{
link(onEvent1,8220547:doText,[])
link(onEvent2,13664646:##clear,[(469,461)(469,502)(268,502)(268,398)])
}
Add(GetDataEx,10884471,350,424)
{
link(Data,14628342:Value,[])
}

карма: 22

8
Голосовали:foksov, login, CriDos, sаmakacd, sla8a, ser_davkin, Assasin, Konst