Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.12;
Скачать: CL | DM;

Вниз

Как заставить 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
1-36667
Micah'GF
2003-11-29 20:51
2003.12.12
strung => array of byte


1-36731
JohnJohn
2003-11-27 18:40
2003.12.12
Можно ли хранить chr(0) в длинных строках D5 ?


3-36581
Mikle
2003-11-20 12:22
2003.12.12
Как в Query ограничить число открываемых записей?


3-36522
MaxwellZ
2003-11-23 17:51
2003.12.12
Индекс текущей записи


1-36689
Developerr
2003-12-02 19:03
2003.12.12
Как можно работать с файлом справки у которого расширение *.chm?