Alex35567 писал(а):
По крайней мере для консолиВчера попробовал такое замутить с сервисом. У меня -- не получилось. Самое интересное, что поток прекрасно отрабатывает асинхронный режим, а вот синхронный совершенно не хочет. Пробовал подцепить UDP (про это был уже разговор) -- ноль эмоций, синхронный режим с doLoopMessage не отработал. А, кстати, почему на событие из асинхронного режима чтения стоит ремарка, а само событие переведено в синхронный режим
------------ Дoбавленo в 09.02:
Вот схемка экспериментального сервиса
Add(NTService,2953706,119,182)
{
Description="Probe"
RunType=0
link(onStart,15354477:doEvent1,[(166,188)(166,132)])
link(onStep,6850796:doLoopMessages,[(167,195)(167,272)])
link(onStop,16084413:doEvent1,[])
}
Add(Application,6850796,217,259)
{
Point(doLoopMessages)
}
Add(Message,15111937,343,126)
{
Caption="Service"
}
Add(Hub,15354477,175,126)
{
link(onEvent1,12839073:doOpen,[])
link(onEvent2,6197093:doMessage,[])
}
Add(Message,6197093,217,133)
{
Message="Probe"
Caption="Start Service"
}
Add(Hub,16084413,175,196)
{
link(onEvent1,12839073:doClose,[(263,202)(263,153)])
link(onEvent2,7827722:doMessage,[(203,209)(203,230)])
}
Add(Message,7827722,217,224)
{
Message="Probe"
Caption="Stop Service"
}
Add(UDP,12839073,294,126)
{
LocalPort=1002
link(onReceive,15111937:doMessage,[])
}
Запускной модуль
Add(MainForm,2953706,245,301)
{
Point(onClose)
}
Add(ServiceTools,5595634,252,154)
{
Name="MyService"
FileName="Probe_Service_2.exe"
link(onExecService,2080226:doMessage,[])
}
Add(Button,3718714,126,168)
{
Left=25
Top=15
TabOrder=-1
Caption="Install"
link(onClick,5595634:doInstall,[])
}
Add(Button,9106985,126,203)
{
Left=95
Top=15
TabOrder=-1
Caption="UnInstall"
link(onClick,5595634:doUninstall,[(205,209)(205,181)])
}
Add(Message,2080226,350,161)
{
Message="Done"
Caption="Probe"
}
Add(Button,8522530,126,98)
{
Left=25
Top=40
TabOrder=-1
Caption="Start"
link(onClick,5595634:doStart,[(205,104)(205,160)])
}
Add(Button,14929074,126,133)
{
Left=95
Top=40
TabOrder=-1
Caption="Stop"
link(onClick,5595634:doStop,[(205,139)(205,167)])
}
Add(Button,10939046,231,238)
{
Left=95
Top=65
TabOrder=-1
Caption="Send"
Data=String(Привет!)
link(onClick,6520829:doSend,[(331,244)(331,230)])
}
Add(Button,980539,231,203)
{
Left=25
Top=65
TabOrder=-1
Caption="Connect"
link(onClick,6520829:doOpen,[(331,209)(331,223)])
}
Add(UDP,6520829,350,217)
{
LocalPort=1001
RemotePort=1002
RemoteIP="127.0.0.1"
AutoConnect=0
ReceiveMode=1
}
Вспомнил, оказывается некому посылать CM_EXECPROC для вызова синхронного события. Млин... и тут косяк.
------------ Дoбавленo в 12.42:
Порылся и нашел, что надо искать реализацию CheckSynchronize, которая не использует оконных обработчиков и применяется в Delphi, начиная с 6-го, вот она-то, как раз, и вызывает события из основного потока