【问题标题】:How to use Synchronize()?如何使用同步()?
【发布时间】: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


【解决方案1】:

Synchronize() 是 RTL 的 TThread 类的方法。在所有版本的 C++Builder 中,TThread 有一个非静态版本的Synchronize(),这是您显示的代码试图调用的版本。这需要为TThread 派生TCriticalThread,例如:

class TCriticalThread : public TThread
{
...
protected:
    virtual void __fastcall Execute();
...
};

void __fastcall TCriticalThread::Execute()
{
   ...
   Synchronize(UpdateCaption);
   ...
}

如果您的情况不是这种情况,TThread 也有一个静态版本的Synchronize(),可以用于不是从TThread 派生的线程,例如:

void __fastcall TCriticalThread::Execute()
{
   ...
   TThread::Synchronize(NULL, UpdateCaption);
   ...
}

【讨论】:

    猜你喜欢
    • 2012-01-20
    • 2017-06-24
    • 2019-07-01
    • 2014-11-17
    • 2018-09-11
    • 2011-11-06
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多