procedure TMyClient.Execute;
var
msg: TMsg;
begin
PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);//创建线程消息队列
while not Terminated do
begin
while PeekMessage(msg, 0, 0, 0,PM_REMOVE) do //取出放入msg中,并删除这个消息
//do something
end;
end;
var
msg: TMsg;
begin
PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);//创建线程消息队列
while not Terminated do
begin
while PeekMessage(msg, 0, 0, 0,PM_REMOVE) do //取出放入msg中,并删除这个消息
//do something
end;
end;
先定义:
const
WM_Mymessage= WM_User+200; 主窗体中
if haswarn[IDDisplay] then
begin
PostThreadMessage(Thread[IDDisplay].threadID,WM_clearwarn,0,0);
……
exit;
end;
线程中:
if PeekMessage(MyMsg,0,0,0,PM_REMOVE) then
begin
if (MyMsg.message = WM_QUIT) then
Terminate //处理myThread.terminate;
else
if MyMsg.message = WM_Mymessage then
begin //处理自定义的消息。
SetStatus(threadID,4,true);
cnt := false;
end;
end;
再问一个问题
TranslateMessage(Msg); DispatchMessage(Msg);两个连用,有什么用处
Getmessage() 可以有选择的从消息列表中得到消息
DispatchMessage() 用来派送消息到窗口过程
TranslateMessage() 用于将Virtul-Key消息翻译为字符消息
Postthreadmessage() 用于向线程发送消息
Postmessage() 用于将消息传送到窗口的消息队列
能说dispatchMessage的实际作用吗?通常用在哪?请指点
var
msg: TMsg;
begin
PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);//创建线程消息队列
while not Terminated do
begin
while PeekMessage(msg, 0, 0, 0,PM_REMOVE) do //取出放入msg中,并删除这个消息
if (msg.message= 我自定义的消息) then //由PostThreadMessage发过来的
begin
//作相应处理。
end else
DispatchMessage(msg);//交由Windows处理分配给指定的窗口(msg.hwnd确定),你可以看一下Application.ProcessMessage
end;
end;
TranslateMessage(MSG)
DispatchMessage(MSG)
因为给我的感觉是已经处理了消息,为什么再DispatchMessage???
通过DispatchMessage,把消息发给窗口过程,让指定的窗口处理消息,不然的话,消息将丢失