![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отсылка сообщения безоконной программе
DelphiN! © (2004-02-13 19:23:00)Сначало запускается консольная программа, далее она подгружает Длл, отправляет ей свой id, полученный ф-ией GetCurrentThreadId,
а Длл в свою очередь сохраняет в переменной procid полученный от главной программы ID. Далее Длл посылает сообщение главной программе, например так:
PostMessage(procid, wm_user, wParam, lParam); А главная программа должна его словить, так вот, как словить сообщение в безоконной программе? В программе с формой я делаю так:
...
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure myproc(var m:tmessage); message wm_user;
public
end;
...
procedure tform1.myproc(var m:tmessage);
begin
...//Вот этот код выполняется при приходе сообщения wm_user
end;
...
Так вот как получить сообщение в консольной программе?
Polevi (2004-02-16 10:15:00) [21]может я конечно не проснулся еще, но где дополнительный кодовый поток ?
Digitman (2004-02-16 08:11:00) [22]значит, в пустоту посылаешь сообщение, т.е. procid не является ThreadId того потока, который ожидает/принимает сообщение
а PostThreadMessage - это функция
DelphiN! (2004-02-15 22:27:00) [23]>Digitman © Дополнительный поток я думаю мне не нужно, так как основной поток не должен больше ничего делать как обрабатывать GetMessage, тоесть в программе нет консольного окна.
Я исправил программу следующим образом, но ничего не работает:
Отсылка из Длл:
PostThreadMessage(strtoint(procid),$0400+1,wparam,lparam);
Прием в основном потоке:
while getmessage(msg,0,0,0) do begin
messagebox(0,pchar(chr(msg.wParam)),'a',0);
...
end;
messagebox вообще не появляется
А мне нужно чтобы при при приходее сообщения в messagebox показывало содержимое msg.wparam
Помогите исправить...
Заранее благодарен
Digitman (2004-02-14 17:43:00) [24]
> DelphiN! © (14.02.04 08:32) [6]
видишь ли, при использовании любого цикла с ожиданием и/или выборкой сообщений потоку его нужно прерывать по каким-то условиям
в случае с while Getmessage() нужно по кр.мере, чтобы кто-то в какой-то момент послал WM_QUIT, а сама система этого делать не будет
кр.того, пока в осн.код.потоке конс.процесса крутится твой цикл. процесс не может реагировать на консольный ввод
отсюда резюме - следует организовать доп.код.поток, в котором будет крутиться этот цикл, а осн.поток тем временем будет способен продолжать реагировать на конс.ввод/вывод, т.е. выполнять блокирующие Read[Ln], Write[Ln] и иже с ними
доп.поток, получив управление, осуществляет загрузку DLL и коммуникации с ней
в момент когда приложение должно завершиться, осн.поток посылает доп.потоку WM_QUIT, дожидается завершения доп.потока и преспокойненько завершает свою работу
Suntechnic (2004-02-14 17:02:00) [25]>DelphiN! ©
В своём примере вместо PeekMessage используй GetMesssage и вместо бесконечного цикла анализируй возвращаемое GetMesssage сообщение. Как только оно true это значит кто-то послал потоку WM_QUIT и пора завершать цикл. И, естественно, свой Sleep убирай совсем.
DelphiN! (2004-02-14 08:32:00) [26]> Suntechnic © А можно примерчик :)
я отсылаю из Длл сообщение таким способом:
PostThreadMessage(strtoint(procid),$0400+1,wparam,lparam);
В переменной procid id основного(принимающего сообщения) процесса, получил я этот id в основном процессе по средством ф-ии
GetCurrentThreadId, а далее передал этот идентификатор в Длл
А в основной программе принимаю так:
while true do begin
if peekmessage(msg,0,0,0,pm_NoRemove) then
messagebox(0,pchar(chr(msg.wParam)),'a',0);
sleep(1000); //Это я вставил чтобы не нагружать процессор
end;
Этот метод не работает, немог бы кто помочь мне исправить ошибку :-)
Suntechnic (2004-02-14 07:21:00) [27]DelphiN! © (13.02.04 20:14) [2]
И еще вопросик, чтобы поток не закрывался, в конце я поставил бесконечный цикл процедур sleep c интервалом 1000 мс, не будет ли мешать этот цикл обработке приходящих сообщений?
Будет мешать. Не делай так никогда.
Вообще по моим личным наблюдениям все начинающие злоупотребляют ф-цией Sleep. Мне известно лишь несколько случаев, когда вызов Sleep необходим действительно (зачастую это просто work around к.л. внутренней недоработки Windows). Запомни раз и навсегда, что Sleep просто замораживает поток, в котором вызвается, на период, указанный в параметре, и ничто не в сотоянии вывести поток из этого состояния (кроме TerminateThread конечно).
Что б твой поток не закрывался, в нём надо организовать цикл обработки сообщений (цикл + GetMessage) или цикл + к.л. Wait- ф-ция. Такой поток легко завершить по команде (как извне так и изнутри) и он не отбирает процессорное время.
Alex Konshin (2004-02-13 21:50:00) [28]http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/postthreadmessage.asp
Alex Konshin (2004-02-13 21:48:00) [29]А почему тебе надо, чтоб поток не закрывался? Наверняка нужно проверять некое событие? Так почему бы не ждатьименно его(их)?
DelphiN! (2004-02-13 20:14:00) [30]А че это за ф-ия, ее в хелпе нету :-)
И еще вопросик, чтобы поток не закрывался, в конце я поставил бесконечный цикл процедур sleep c интервалом 1000 мс, не будет ли мешать этот цикл обработке приходящих сообщений?
Юрий Зотов (2004-02-13 20:02:00) [31]Посмотрите Post ThreadMesssage.
Соответственно, поток должен иметь механизм выборки сообщений.
nikkie (2004-01-23 13:15:00) [32]>Так то оно так, но согласитесь, что не стоит "выкидывать" статью, только потому...
нет, ну вот привязался... :)
приведите пример хорошей статьи, где рассказано о хуках и "акцентируется внимание на чем-нибудь более важном, чем проецирование данных во все процессы". и я соглашусь, что эту статью не надо выкидывать.
а пока что я легко нашел пару статей про хуки, где вообще никаких упоминаний про взаимодействие между процессами нет. и код неверный. что, например, с такой статьей делать?
http://www.sources.ru/delphi/delphi_introduction_to_hook_procedures.shtml