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

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

GetMessage в отдельном потоке


Страницы:   1 2 3 4

msg ©   (2006-03-09 12:11:00) 

В отдельном потоке (TThread) создаю форму:

procedure TTest.Execute;
var
msg:TMsg;
wnd:HWND;
wc:WNDCLASS;
begin
wc.style:=0;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=hInstance;
wc.hIcon:=0;
wc.hCursor:=0;
wc.hbrBackground:=GetStockObject(LTGRAY_BRUSH);
wc.lpszMenuName:=nil;
wc.lpszClassName:='asdasd';
wc.lpfnWndProc:=@WndProc;

Windows.RegisterClass(wc);
wnd:=CreateWindow(
  'asdasd',
  'Hello world',
  WS_CAPTION,
  10,
  10,
  200,
  80,
  HWND_DESKTOP,
  0,
  hInstance,
  nil
);

 while GetMessage(Msg,wnd,0,0) do
 begin
   TranslateMessage(Msg);
   DispatchMessage(Msg);
 end;

DestroyWindow(wnd);
Windows.UnRegisterClass('asdasd', hInstance);
end;

WndProc выглядит примерно так:

function WndProc(wnd:HWND; msg:UINT; w:UINT; l:UINT):UINT;stdcall;
var
begin
Result:=0;
case msg of
  WM_QUIT: ;
  WM_PAINT: ;
else
  Result:=DefWindowProc(wnd,msg,w,l);
end;
end;

В основном потоке создаю отдельный поток:

var
T: TTest;
procedure TForm1.Button1Click(Sender: TObject);
begin
T := TTest.Create(true);
with T do
begin
  FreeOnTerminate:=true;
  Resume;
end;
end;

и посылаю сообщение:

procedure TForm1.Button2Click(Sender: TObject);
var
h:hWnd;
begin
 h := FindWindow('asdasd', nil);
 SendMessage(h, WM_QUIT, 0, 0);
end;

GetMessage ни в какую не желает принимать сообщение, даже если написать GetMessage(Msg,0,0,0), в то же время WndProc сообщение принимает. Я так понимаю, что посланные мной сообщения принимает обработчик главного потока. Так ли это? И нужен ли вообще, в таком случае, GetMessage в отдельном потоке?


begin...end   (2006-03-09 17:00:00) [61]

> msg   (09.03.06 16:00) [3]

Сообщения, посылаемые окну потока с помощью Send Message, называются синхронными, а сообщения, посылаемые функцией Post Message -- асинхронными.

Вызванная функция GetMessage потока-приёмника вначале определяет по особому флагу в структуре потока, посланы ли потоку синхронные сообщения, и, если да, поочерёдно передаёт эти сообщения непосредственно оконным процедурам нужных окон. После этого GetMessage не возвращает управление (что мы и наблюдаем), а проверяет наличие асинхронных сообщений. И до тех пор, пока в очереди не будет обнаружено асинхронное сообщение или в структуре потока не будет обнаружен один из специальных флагов, GetMessage ничего не возвратит.

> И нужен ли вообще, в таком случае, GetMessage в отдельном
> потоке?

Нужен. Без вызова GetMessage WM_QUIT не передалось бы оконной процедуре.


Сергей М.   (2006-03-09 17:00:00) [62]

> GetMessage как занимался выборкой сообщений из очереди сообщений,
>  так и занимается


Так точно.
Кодовый поток процесса, используя WinAPI, занимается либо ожиданием/выборкой, либо синхронной отправкой/ожиданием рез-та. Есть иное мнение ?


Crash Coredump   (2006-03-09 16:59:00) [63]

Сергей М. ©   (09.03.06 16:55) [13]

А ты скажи, какой именно раздел надо штудировать ?

А то вот я один проштудировал, а там написано:

"The GetMessage function retrieves a message from the calling thread's message queue and places it in the specified structure. This function can retrieve both messages associated with a specified window and thread messages posted via the PostThreadMessage function."

и еще один раздел проштудировал:

"he SendMessage function sends the specified message to a window or windows. The function calls the window procedure for the specified window and does not return until the window procedure has processed the message. The PostMessage function, in contrast, posts a message to a thread's message queue and returns immediately"

Или у тебя есть секретное издание MSDN ?


Сергей М.   (2006-03-09 16:55:00) [64]


> Crash Coredump ©   (09.03.06 16:52) [12]


Нет слов.

Бегом штудировать MSN !


Crash Coredump   (2006-03-09 16:52:00) [65]

Сергей М. ©   (09.03.06 16:46) [10]


> В пределах одногго и того же кодового потока понятие "очередь"
> не имеет смысла


Ты это разработчикам Windows расскажи, а мы вместе посмеемся над их ответом тебе. Заодно посмотри реализацию TCustomForm.Release, в котором понятие "очередь" в пределах одного потока весьма уместно используется.


> Речь идет об интерпоточном взаимодействии.


А какая разница ? GetMessage как занимался выборкой сообщений из очереди сообщений, так и занимается, хоть в одном потоке, хоть в десяти.


Сергей М.   (2006-03-09 16:48:00) [66]


> Crash Coredump


В пределах одногго и того же кодового потока понятие "очередь" не имеет смысла.


Сергей М.   (2006-03-09 16:46:00) [67]

Речь идет об интерпоточном взаимодействии.


Crash Coredump   (2006-03-09 16:45:00) [68]

Сергей М. ©   (09.03.06 16:44) [8]

Ругаться я не хуже тебя умею, поверь.

Пример кода, в котором GetMessage выбирает сообщения, посланные по SendMessage будет ?


Сергей М.   (2006-03-09 16:44:00) [69]


> Crash Coredump ©   (09.03.06 16:23) [7]


Ты облажался.
По полной программе.


Crash Coredump   (2006-03-09 16:23:00) [70]

Сергей М. ©   (09.03.06 16:12) [6]

Да ну ? Будут ? И дальше провалятся в TranslateMessage|DispatchMessage ?

А ты код напиши для примера, вместе посмотрим.


Сергей М.   (2006-03-09 16:12:00) [71]


> Сообщения по SendMessage никогда не будут выбраны вызовом
> GetMessage


Бред сивой кобылы.


Crash Coredump   (2006-03-09 16:08:00) [72]


> SendMessage ждет ответ, PostMessage нет, впр не о том обсалютно.


Не ту справку читаешь, почитай еще. Сообщения по SendMessage никогда не будут выбраны вызовом GetMessage


Сергей М.   (2006-03-09 16:03:00) [73]


> GetMessage все равно не вызывается


Бред сивой кобылы несешь.


> Вот и я всегда так думал


Что тут думать ? Это - реальность .. концепция, придуманная не мной и не тобой.


msg   (2006-03-09 16:00:00) [74]

> RTFM, RTFM и еще раз RTFM, как завещал великий Ленин, про отличия SendMessage от PostMessage

SendMessage ждет ответ, PostMessage нет, впр не о том обсалютно.

> Цитата из справки :

само собой, мне это известно и справку я читать умею. А GetMessage все равно не вызывается, ну никак и из цикла не выходит...

>Нет, не так.
>Поток, создавший некое окно, ответственен за прием сообщений, адресованных этому окну.


Вот и я всегда так думал...


Сергей М.   (2006-03-09 12:24:00) [75]


> GetMessage ни в какую не желает принимать сообщение


Цитата из справки :

If the function retrieves the WM_QUIT message, the return value is zero

Zero - это False

При этом произойдет выход из while-цикла.


> Я так понимаю, что посланные мной сообщения принимает обработчик
> главного потока. Так ли это?


Нет, не так.
Поток, создавший некое окно, ответственен за прием сообщений, адресованных этому окну.


> нужен ли вообще, в таком случае, GetMessage в отдельном
> потоке?


Разумеется нужен !


Crash Coredump   (2006-03-09 12:16:00) [76]


> GetMessage ни в какую не желает принимать сообщение


RTFM, RTFM и еще раз RTFM, как завещал великий Ленин, про отличия SendMessage от PostMessage


Страницы:   1 2 3 4

Наверх

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