![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GetMessage в отдельном потоке
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