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,[]) }
------------ Дoбавленo в 09.04:
Запускной модуль
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 }
------------ Дoбавленo в 11.08:
Вспомнил, оказывается некому посылать CM_EXECPROC для вызова синхронного события. Млин... и тут косяк.
------------ Дoбавленo в 12.42:
Порылся и нашел, что надо искать реализацию CheckSynchronize, которая не использует оконных обработчиков и применяется в Delphi, начиная с 6-го, вот она-то, как раз, и вызывает события из основного потока
|