Вверх ↑
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
#61: 2015-01-15 10:20:36 ЛС | профиль | цитата
nesco писал(а):
а почему оно сейчас не ловит событие в приложении, из которого послано
Дык я же убил поток который его ловить типа должен... Беспощадно.

А вот так - получает:
Add(MainForm,12086188,511,161)
{
Position=1
link(onCreate,8704945:doEvent1,[])
}
Add(Events,9649812,700,175)
{
Name="MyCoolEvent"
ManualReset=1
AddHint(-30,-25,78,13,Name)
}
Add(WaitObject,9175818,700,224)
{
link(ObjHandle,9649812:ObjHandle,[])
AddHint(2,40,24,13,Time)
}
Add(Thread,13945738,644,224)
{
Delay=0
link(onExec,9175818:doWait,[])
link(onSyncExec,11144088:doData,[])
}
Add(Hub,8704945,574,175)
{
link(onEvent1,9649812:doCreate,[])
link(onEvent2,14910826:doWork1,[(613,188)])
}
Add(Button,9022058,511,315)
{
Left=100
Top=40
Width=180
Height=40
Align=2
Caption="Просигнализирвать!"
link(onClick,11297637:doEvent1,[])
}
Add(Hub,11297637,574,315)
{
OutCount=3
link(onEvent1,13945738:doStop,[(606,321)(606,237)])
link(onEvent2,9649812:doSet,[(620,328)(620,188)])
link(onEvent3,14910826:doWork3,[(613,335)])
}
Add(ListBox,5200896,819,231)
{
Left=920
Top=115
Align=5
}
Add(DoData,11144088,756,231)
{
Data=String(++Событие получено)
link(onEventData,5200896:doAdd,[])
}
Add(HubEx,14910826,609,224)
{
link(onEvent,13945738:doStart,[])
}
--- если других "ожидателей" нету.
Добавки

В INI:
ManualReset=True - сброс только по doReset; False - автоматический (и атомарный) сброс состояния ожидающим (и дождавшимся) потоком|14|0|True,False
В PAS:
#pas
...
_prop_ManualReset:boolean; //Добавлено
...
FEvent := CreateEvent(nil,_prop_ManualReset,false,PChar(_prop_Name)); //Заменен true на _prop_ManualReset
...
карма: 9

0
Ответов: 4631
Рейтинг: 749
#62: 2015-01-15 11:50:59 ЛС | профиль | цитата
[offtop]Если уж модифицируете Events - подумайте на предмет таких изменений: [url]forum.html?q=3&p=269657#p269657[/url]
Кстати, там возможно делать безымянное событие, которое можно будет ловить только внутри текущей программы только с того элемента, который просигналил.[/offtop]
карма: 26

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#63: 2015-01-15 12:37:07 ЛС | профиль | цитата
Вот что у меня получилось с синхронизируемым SharedStream, по обмене текстом между двумя копиями

Add(MainForm,11176470,399,84)
{
Left=20
Top=105
Width=527
Caption="MemoryMapFile"
Point(onClose)
link(onCreate,14190799:doEvent1,[])
}
Add(DoData,2298906,469,161)
{
link(onEventData,1143428:doPut,[])
link(Data,11804486:Text,[(475,152)(566,152)(566,208)(664,208)])
}
Add(DataToFile,1143428,525,161)
{
Type=6
Point(doPosition)
Point(Position)
link(onGet,398725:doEvent1,[])
link(Stream,11748904:Stream,[])
}
Add(Hub,9182042,413,154)
{
link(onEvent1,2836025:doWork1,[(445,160)])
link(onEvent2,2298906:doData,[])
}
Add(HubEx,2836025,441,175)
{
link(onEvent,1143428:doPosition,[])
}
Add(Hub,1104125,413,231)
{
link(onEvent1,2836025:doWork3,[(445,237)])
link(onEvent2,1143428:doGet,[(509,244)(509,174)])
}
Add(SharedStream,11748904,525,98)
{
CoreName="My_MapFile"
PageMem=4
link(onOpen,11176470:doCaption,[(564,104)(564,76)(389,76)(389,90)])
}
Add(Memo,11804486,658,147)
{
Width=574
Height=387
Align=5
Font=[Courier New,10,1,0,204]
Point(doSetSelStart)
Point(onKeyUp)
link(onChange,13184547:doEvent,[])
}
Add(Hub,14190799,448,98)
{
link(onEvent1,11748904:doOpen,[])
link(onEvent2,2286399:doWork,[(473,111)(473,146)(32,146)(32,181)])
}
Add(Events,9649812,287,175)
{
Name="MyCoolEvent"
ManualReset=1
AddHint(-30,-25,78,13,Name)
}
Add(WaitObject,9175818,287,224)
{
link(ObjHandle,9649812:ObjHandle,[])
AddHint(2,40,24,13,Time)
}
Add(Thread,13945738,231,224)
{
Delay=0
link(onExec,9175818:doWait,[])
link(onSyncExec,7396459:doWork,[])
}
Add(Hub,8704945,140,175)
{
link(onEvent1,9649812:doCreate,[])
link(onEvent2,14910826:doWork1,[(200,188)])
}
Add(Hub,11297637,140,224)
{
OutCount=5
link(onEvent1,9182042:doEvent1,[(165,230)(165,160)])
link(onEvent2,13945738:doStop,[])
link(onEvent3,9649812:doSet,[(207,244)(207,188)])
link(onEvent4,9649812:doReset,[(214,251)(214,195)])
link(onEvent5,14910826:doWork3,[(200,258)])
}
Add(HubEx,14910826,196,224)
{
link(onEvent,13945738:doStart,[])
}
Add(Check,2286399,42,175)
{
Caption="CreateEvent"
link(onEvent,8704945:doEvent1,[])
}
Add(Check,13004025,42,224)
{
Caption="Write"
link(onEvent,11297637:doEvent1,[])
}
Add(Check,7396459,343,231)
{
Caption="Read"
link(onEvent,1104125:doEvent1,[])
}
Add(Hub,398725,602,161)
{
OutCount=3
link(onEvent1,14592248:doReset,[(627,167)(627,111)])
link(onEvent2,11804486:doText,[])
link(onEvent3,14592248:doOn,[(634,181)(634,118)])
}
Add(IndexToChanel,13184547,714,147)
{
Point(Index)
link(onEvent1,13004025:doWork,[(753,153)(753,272)(32,272)(32,230)])
link(Index,14592248:State,[])
}
Add(Switch,14592248,714,98)
{
DataOn=Integer(0)
DataOff=Integer(1)
Default=0
Point(doOn)
Point(State)
}

карма: 22

0
Ответов: 9906
Рейтинг: 351
#64: 2015-01-15 14:38:51 ЛС | профиль | цитата
Netspirit писал(а):
Кстати, там возможно делать безымянное событие

Кстати2: это же можно сделать и для стрима.
Кстати3: это делается значительно проще (я заглянул в коды) - @_prop_Name

Да, я согласен, всякие там doCreate - никому не нужный геморрой. А за "старые песни о главном" - пусть nesco решение принимает
карма: 9

0
Ответов: 4631
Рейтинг: 749
#65: 2015-01-15 14:44:25 ЛС | профиль | цитата
В каком месте?
карма: 26

0
Ответов: 9906
Рейтинг: 351
#66: 2015-01-15 15:13:39 ЛС | профиль | цитата
В твоем месте
#pas
procedure THIEvents.SetName(Value: string);
var V: PChar;
begin
if FEvent <> 0 then CloseHandle(FEvent);
if Length(Value) > 0 then V := PChar(Value) else V := nil;
FEvent := CreateEvent(nil, True, False, V);
end;

Вот так будет проще:
#pas
procedure THIEvents.SetName(Value: string);
begin
if FEvent <> 0 then CloseHandle(FEvent); // Логично
FEvent := CreateEvent(nil, True, False, @Value); // А так - проще
end;
Ибо: лучшее средство от перхоти - гильотина
карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#67: 2015-01-15 15:14:56 ЛС | профиль | цитата
Galkov писал(а):
А за "старые песни о главном" - пусть nesco решение принимает

Коллегиально, только коллегиально. Я на себя такую ответственность не возьму
карма: 22

0
Ответов: 9906
Рейтинг: 351
#68: 2015-01-15 15:15:36 ЛС | профиль | цитата
Дык мы то давно ЗА
карма: 9

0
Ответов: 4631
Рейтинг: 749
#69: 2015-01-15 15:16:07 ЛС | профиль | цитата
С @Value - понятно, а то смотрю - @_prop_Name. Откуда оно, куда...
Только если будет объединен мой код с твоим ManualReset, то нужно будет смотреть порядок инициализации свойств в ini. Если свойство Name будет первым (что логично), тогда код из SetName перенести в SetManualReset (также сделать _prop_Name: string; property _prop_ManualReset: Boolean write SetManualReset;)
карма: 26

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#70: 2015-01-15 15:17:07 ЛС | профиль | цитата
Galkov, а _prop_ManualReset точно будет доступно из SetName
карма: 22

0
Ответов: 9906
Рейтинг: 351
#71: 2015-01-15 15:18:54 ЛС | профиль | цитата
Точно
карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#72: 2015-01-15 15:20:25 ЛС | профиль | цитата
Кстати, мне не очень импонирует убирание doDestroy из списка методов. А onCreate, кстати, используется в примерах для запуска WaitObject
карма: 22

0
Ответов: 9906
Рейтинг: 351
#73: 2015-01-15 15:20:27 ЛС | профиль | цитата
Если оно расположено ДО Name в INI-файле.
карма: 9

0
Ответов: 4631
Рейтинг: 749
#74: 2015-01-15 15:26:31 ЛС | профиль | цитата
nesco, если нет doCreate, то и onCreate не нужен. А какой смысл в doDestroy?
карма: 26

0
Ответов: 9906
Рейтинг: 351
#75: 2015-01-15 15:27:12 ЛС | профиль | цитата
Короче, технология коллеги Netspirit предполагает создание (CreateEvent) события в перехвате установки самого последнего св-ва.
Теоретически, можно не делать SetEvent, но делать SetManualReset (если очень хочется сделать ManualReset именно последним св-вом)
#pas
procedure THIEvents.SetManualReset(Value: boolean);
begin
if FEvent <> 0 then CloseHandle(FEvent);
FEvent := CreateEvent(nil, Value, False, @_prop_Name);
end;
Тут, как говорится: Кому нравится поп, а кому - попадья
карма: 9

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)