Форум: "Система";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
ВнизКак заставить TTHread принимать сообщения Найти похожие ветки
← →
pasha (2003-10-01 23:49) [0]Есть сервис, который создает доплнительный поток TTHread. Ему и надо принимать сообщения. Сообщения посылаються из DLL
Wm_SysKeyPress := RegisterWindowMessage("MyStringMessage");
PostThraedMessage(Id,Wm_SysKeyPress,0,0);
Id передаётся как значения параметра MyThread1.ThreadID
в обработчике onExecute принимаю все сообщения
while not Terminated do
begin
MsgRes := GetMessage(SysMsg, 0, 0, 0);
if MsgRes then
begin
if (SysMsg.hwnd = 0) and (SysMsg.message = WM_SystemKeyPress) then
begin
Synchronize(GetMsg);
end
else
DispatchMessage(SysMsg);
end;
end;
← →
HolACost! (2003-10-02 07:20) [1]Как штрашно! :(
Легче всё намного легче! - цикл бесконечный это круто!
← →
Digitman (2003-10-02 08:11) [2]ине непонятно главное : ЗАЧЕМ у тебя сервис создает доп.код.поток, если он (сервис твой) сам выполняется в доп.код.потоке ?
далее.
> Как заставить TTHread принимать сообщения
> принимаю все сообщения
"как понимать тебя, Саид ?"
(с) Черный Абдула
и потом, коль цикл таки есть, он выглядеть иначе :
while not Terminated and GetMessage(SysMsg, 0, 0, 0) do
begin
if (SysMsg.hwnd = 0) and (SysMsg.message = WM_SystemKeyPress)
begin
... // на кой шут здесь Synchronize() - тоже, кстати, неясно
end
else
DispatchMessage(SysMsg);
end;
← →
Digitman (2003-10-02 08:14) [3]ине непонятно главное : ЗАЧЕМ у тебя сервис создает доп.код.поток, если он (сервис твой) сам выполняется в доп.код.потоке ?
далее.
> Как заставить TTHread принимать сообщения
> принимаю все сообщения
"как понимать тебя, Саид ?"
(с) Черный Абдула
и потом, коль цикл таки есть, он выглядеть иначе :
while not Terminated and GetMessage(SysMsg, 0, 0, 0) do
begin
if (SysMsg.hwnd = 0) and (SysMsg.message = WM_SystemKeyPress)
begin
... // на кой шут здесь Synchronize() - тоже, кстати, неясно
end
else
DispatchMessage(SysMsg);
end;
← →
pasha (2003-10-02 10:28) [4]Весь прикол в том, что из любого другого приложения EXE сообщения принимаются, а из DLL нет.
TTHread создаю потому что в обработчике OnExecute самого TService идет прием сообщений от SERVICE_CONTROL:
LoadParameters;
try
while not Terminated do
ServiceThread.ProcessRequests(true);
finally
If Modified then
SaveParameters;
end;
← →
Digitman (2003-10-02 10:45) [5]
> TTHread создаю потому что в обработчике OnExecute самого
> TService идет прием сообщений от SERVICE_CONTROL:
ну и что ? а разве нельзя одновременно и оперативно реагировать на запросы сервис-менеджера и на сообщения потоку ? да запросто !
while not Terminated do //пока диспетчер сервис-приложения не скомандовал потоку сервиса "закругляться"
try
if PeekMessage(SysMsg, 0, 0, 0, PM_REMOVE) then // если есть сообщения, то удаляем их из очереди
DispatchMessage(SysMsg); // и тут же быстренько (!) обрабатываем
finally
ProcessRequests(False); // и теперь, если есть запросы от сервис-менеджера - обрабатываем их тут же, а иначе - не ждем и идем на след.итерацию цикла WHILE
end;
end;
← →
pasha (2003-10-02 10:57) [6]
> ну и что ? а разве нельзя одновременно и оперативно реагировать
> на запросы сервис-менеджера и на сообщения потоку ? да запросто
> !
Смысл принимать сообщение и тут же помещать это же сообщение в очередь. Может быть так:
while not Terminated do
try
if PeekMessage(SysMsg, 0, 0, 0, PM_REMOVE) then
begin
if (SysMsg.hwnd = 0) and (SysMsg.message = WM_SystemKeyPress) then
//Working with message
else
DispatchMessage(SysMsg);
finally
ProcessRequests(False);
end;
end;
← →
pasha (2003-10-02 10:58) [7]
> Digitman ©
Спасибо за подкинутую идею
← →
Digitman (2003-10-02 11:23) [8]
> Смысл принимать сообщение и тут же помещать это же сообщение
> в очередь
главное, что ты его (сообщение) примешь !
а уж дальше делай с ним что хошь) ... но - как можно быстрее, иначе твой сервис будет с тормозами реагировать на запросы сервис-менеджера
← →
pasha (2003-10-02 12:17) [9]
> но - как можно быстрее, иначе твой сервис будет с тормозами
> реагировать на запросы сервис-менеджера
А тогда может имеет смысл тспользовать TTHread
← →
Digitman (2003-10-02 13:32) [10]
> pasha
как доп.код.поток, исполняющий длит.обработку чего-то - да, имеет смысл ... но не более того
← →
pasha (2003-10-02 23:37) [11]Большое спасибо Digitman. Но вопрос остается в силе как получить в мой поток сообщение из DLL(из EXE все работает нормально).
← →
Digitman (2003-10-03 09:34) [12]а какая разница, из кода какого модуля (DLL или EXE) отправляется сообщение ? абсолютно никакой !
если адресат указан корректно, и адресат - именно код.поток, а не окно, им открытое, то сообщение это будет 100%-но поставлено в очередь сообщений потока-адресата
← →
pasha (2003-10-04 01:11) [13]
> адресат - именно код.поток, а не окно, им открытое
Подскажи Digitman как это проверить, плз!?
← →
Digitman (2003-10-04 11:36) [14]чего ? проверить-то ?
окну кодового потока ты шлешь сообщения с пом. Sens/PostMessage(hWnd)
а самому код.потоку - PostThreadMessage(ThreadId)
так что перепутать невозможно - в одном случае сообщение посылается с указанием дескриптора окна, а в другом и ф-ция совсем другая и аргумент ее - не дескриптор окна, а Id потока
← →
pasha (2003-10-04 11:48) [15]Digitman - рулез
Но у меня сообщения отправляются точно также,принимаются с помощью GetMessage. Но ошибка была в совсем другом, я всем благодарен. Особое спасибо Digitman.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c