如何在主线程中执行不基于TThread的线程?

use*_*150 5 delphi

例如,来自可执行文件或DLL中的CreateTimerQueueTimer回调提供的线程?具有与主线程相同的线程ID是很重要的.

procedure TMyMainClass.ExecuteMe(someparam: paramtype);
begin
  {something}
end;
Run Code Online (Sandbox Code Playgroud)

procedure TimerCallback(pvContext: pointer; fTimerOrWaitFired: boolean); stdcall;
begin
  {do what ?}
end;
Run Code Online (Sandbox Code Playgroud)

Final update:
所有这些东西(TThread.Synchronize,TThread.Queue,PostThreadMessage等)的作品通过消息.因此,请确保dll在等待回调时主机应用处理消息.

Dav*_*nan 7

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

如果您碰巧使用的是没有这些方法的旧Delphi编译器,那么SendMessage或者PostMessage使用用户定义的消息是最简单的解决方案.

  • 你需要两个参数版本并传递nil作为第一个参数. (4认同)
  • [DCC错误] UnitMain.pas(130):E2389这里的受保护成员'TThread.Synchronize'(Delphi XE2)在`TThread.Synchronize(qt.SendEvent)上是不可访问的 (2认同)