如何在主线程中执行非TThread基础的线程?

6
例如,从CreateTimerQueueTimer的回调函数提供的线程中?与主线程具有相同的线程ID非常重要。
procedure TMyMainClass.ExecuteMe(someparam: paramtype);
begin
  {something}
end;

并且

procedure TimerCallback(pvContext: pointer; fTimerOrWaitFired: boolean); stdcall;
begin
  {do what ?}
end;

最终更新: 所有这些东西(TThread.SynchronizeTThread.QueuePostThreadMessage 等)都是通过消息来工作的。因此,请确保您的 dll 的宿主应用程序在等待回调时处理消息。
1个回答

8

要在主线程中执行代码,而没有访问TThread实例,请调用类方法TThread.SynchronizeTThread.Queue

如果您使用的是旧版的Delphi编译器,它没有这些方法,那么使用带有用户自定义消息的SendMessagePostMessage是最简单的解决方案。


TThread.Synchronize 需要 TThread 对象,但回调只是具有不同线程 ID 的过程。 - user2091150
1
不是这样的。我指的是类方法,所以不需要实例。 - David Heffernan
3
【DCC Error】UnitMain.pas(130):E2389 受保护成员'TThread.Synchronize'在此处不可访问(Delphi XE2),位于TThread.Synchronize(qt.SendEvent)。该错误提示表明,在Delphi XE2中,对于TThread.Synchronize的受保护成员,您无法在此处进行访问。具体地说,它位于代码行TThread.Synchronize(qt.SendEvent) - user2091150
6
你需要使用两个参数的版本,并将第一个参数传递为nil。 - David Heffernan
当我尝试在dll中执行函数并执行System.Classes中的第12181行TMonitor.Exit(ThreadLock);时,它从未能够成功执行。 - user2091150
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接