【发布时间】:2018-08-02 11:42:49
【问题描述】:
手册上说 Synchronize 是 TThread 的成员。 但是它表明您可以直接调用 Synchronize。其他sources 也一样。
//Synchronize() performs actions contained in a routine as if they were executed from the main VCL thread
void __fastcall TCriticalThread::Execute()
{
...
Synchronize(UpdateCaption);
...
}
但如果我这样做,我的编译器会告诉我“E2268 调用未定义的函数‘同步’”。当然我包括图书馆:
#include <System.Classes.hpp>
另一方面,TThread::Synchronize 被编译器发现,但它不接受 MainThreadID 作为参数:
TThread::Synchronize(MainThreadID, MainForm->UpdateCaption );
PS:我是 C++ Builder 的新手。
【问题讨论】:
-
显示
TCriticalThread类的定义。是TThread的后代吗? -
@MBo - 这只是我从“其他来源”(见链接)获取的一段代码,以表明 Embarcadero 文档和其他来源告诉我们应该能够直接调用 Synchronize .
-
我们绝对可以直接从属于 TThread 后代的方法体中调用 Synchronize。这就是我对类描述感兴趣的原因。请提供真正的代码。
-
我在一个回调函数中,在一个 DLL 中。工作线程每隔几毫秒调用一次这个回调函数。
-
在 DLL 中调用
TThread::Synchronize()不会 调用调用应用程序的 UI 线程中的指定方法,除非 1) 你的 DLL 是一个 BPL 运行时包,它共享一个RTL 与应用程序的常见实例或 2) 您的 DLL 导出一个调用 RTL 的CheckSynchronize()函数的函数,然后应用程序在其 UI 线程中定期调用该导出的 DLL 函数。Synchronize()将方法指针存储在一个内部队列中,CheckSynchronize()处理该队列,当应用和 DLL 使用单独的 RTL 实例编译时,该队列不与应用共享。
标签: c++ multithreading delphi thread-safety c++builder