gpt4 book ai didi

multithreading - Delphi线程未接收消息

转载 作者:行者123 更新时间:2023-12-03 15:19:55 26 4
gpt4 key购买 nike

我正在开发一个具有多线程的应用程序(RAD Studio XE5)。在应用程序启动时,我创建了一个线程,该线程的生存时间与主窗体一样长。

我能够将消息从线程分派(dispatch)到应用程序中创建的任何表单,但是我找不到相反的方法,将消息从主 VCL 线程发送到工作线程。

创建主窗体时,我创建工作线程并将句柄复制到公共(public)变量中:

  serverThread := TMyThread.Create(True, ServerPort + 1);
serverThreadHandle := serverThread.Handle; // SAVE HANDLE
serverThread.Start;

然后(从不同的形式 FrmSender)我向线程发送一条消息:

  PostMessage(uMain.serverThreadHandle, UM_LOC_VCLMSG, UM_LOC_VCLMSG, Integer(PStrListVar));

这是线程的执行过程:

procedure TMyThread.Execute;
var
(..)
vclMSG : TMsg;
str1, str2 : string;
(..)
begin
while not(Terminated) do
begin
Sleep(10);
if Assigned(FrmSender) then
if FrmSender.HandleAllocated then
if PeekMessage(vclMSG, FrmSender.Handle, 0, 0, PM_NOREMOVE) then
begin
if vclMSG.message = UM_LOC_VCLMSG then
begin
try
pStrListVar := pStrList(vclMSG.lParam);
str1 := pStrListVar^.Strings[0];
str2 := pStrListVar^.Strings[1];
finally
Dispose(pStrListVar);
end;
end;
end;
(.. do other stuff ..)
end;
end;

但是PeekMessage()永远不会返回true,就好像它从未收到任何消息一样。我尝试将参数更改为 PeekMessage():

PeekMessage(vclMSG, 0, 0, 0, PM_NOREMOVE);

但是没有结果。有什么想法吗?

最佳答案

来自MSDN PostMessage function documentation :

Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.

To post a message in the message queue associated with a thread, use the PostThreadMessage function.

因此,您应该使用 PostThreadMessage :

Posts a message to the message queue of the specified thread. It returns without waiting for the thread to process the message.

特别注意备注部分。接收线程需要一个消息队列。按照以下步骤强制线程拥有一个:

  • 创建一个事件对象,然后创建线程。
  • 使用WaitForSingleObject函数等待事件被设置为调用 PostThreadMessage 之前的信号状态。
  • 在将发布消息的线程中,调用 PeekMessage(如下所示)以强制系统创建消息队列。

    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)
  • 设置事件,以表明线程已准备好接收发布的消息。

然后,当使用PeekMessage时,您将句柄值 -1 传递给该函数,如文档所述。

关于multithreading - Delphi线程未接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40001899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com