![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как заставить TTHread принимать сообщения [D7, NT4, Win2k, WinXP]
pasha © (2003-10-01 23:49:00)
Есть сервис, который создает доплнительный поток 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;
pasha (2003-10-04 11:48:00) [1]
Digitman- рулез
Но у меня сообщения отправляются точно также,принимаются с помощью GetMessage. Но ошибка была в совсем другом, я всем благодарен. Особое спасибо Digitman.
Digitman (2003-10-04 11:36:00) [2]
чего ? проверить-то ?
окну кодового потока ты шлешь сообщения с пом. Sens/PostMessage(hWnd)
а самому код.потоку - PostThreadMessage(ThreadId)
так что перепутать невозможно - в одном случае сообщение посылается с указанием дескриптора окна, а в другом и ф-ция совсем другая и аргумент ее - не дескриптор окна, а Id потока
pasha (2003-10-04 01:11:00) [3]
> адресат - именно код.поток, а не окно, им открытое
Подскажи Digitman как это проверить, плз!?
Digitman (2003-10-03 09:34:00) [4]
а какая разница, из кода какого модуля (DLL или EXE) отправляется сообщение ? абсолютно никакой !
если адресат указан корректно, и адресат - именно код.поток, а не окно, им открытое, то сообщение это будет 100%-но поставлено в очередь сообщений потока-адресата
pasha (2003-10-02 23:37:00) [5]
Большое спасибо Digitman. Но вопрос остается в силе как получить в мой поток сообщение из DLL(из EXE все работает нормально).
Digitman (2003-10-02 13:32:00) [6]
> pasha
как доп.код.поток, исполняющий длит.обработку чего-то - да, имеет смысл ... но не более того
pasha (2003-10-02 12:17:00) [7]
> но - как можно быстрее, иначе твой сервис будет с тормозами
> реагировать на запросы сервис-менеджера
А тогда может имеет смысл тспользовать TTHread
Digitman (2003-10-02 11:23:00) [8]
> Смысл принимать сообщение и тут же помещать это же сообщение
> в очередь
главное, что ты его (сообщение) примешь !
а уж дальше делай с ним что хошь) ... но - как можно быстрее, иначе твой сервис будет с тормозами реагировать на запросы сервис-менеджера
pasha (2003-10-02 10:58:00) [9]
> Digitman ©
Спасибо за подкинутую идею
pasha (2003-10-02 10:57:00) [10]
> ну и что ? а разве нельзя одновременно и оперативно реагировать
> на запросы сервис-менеджера и на сообщения потоку ? да запросто
> !
Смысл принимать сообщение и тут же помещать это же сообщение в очередь. Может быть так:
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;
Digitman (2003-10-02 10:45:00) [11]
> 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:28:00) [12]
Весь прикол в том, что из любого другого приложения 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 08:14:00) [13]
ине непонятно главное : ЗАЧЕМ у тебя сервис создает доп.код.поток, если он (сервис твой) сам выполняется в доп.код.потоке ?
далее.
> Как заставить 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:11:00) [14]
ине непонятно главное : ЗАЧЕМ у тебя сервис создает доп.код.поток, если он (сервис твой) сам выполняется в доп.код.потоке ?
далее.
> Как заставить 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;
HolACost! (2003-10-02 07:20:00) [15]
Как штрашно! :(
Легче всё намного легче! - цикл бесконечный это круто!