Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отсылка сообщения безоконной программе


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо