Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
1-36703
kutsanov
2003-11-30 11:32
2003.12.12
Совместить графику и текст в одном файле?


9-36495
Nostradamus
2002-10-08 18:47
2003.12.12
Прорисовка в DelphiX


4-36909
idr
2003-10-20 11:29
2003.12.12
Пуст ли буфер обмена?


6-36785
LOGic
2003-10-15 14:57
2003.12.12
Уважаемые мастера !! вот с такой проблемой столкнулся нужно по PO


1-36694
Davron
2003-12-02 18:13
2003.12.12
Delphi: ошибка в MessageDlg





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский