如何使用Synchronize()?

WeG*_*ars 2 c++ delphi multithreading c++builder thread-safety

手册说Synchronize是TThread的成员.但是,它表明您可以直接调用Synchronize.其他消息来源也是如此.

//Synchronize() performs actions contained in a routine as if they were executed from the main VCL thread    

void __fastcall TCriticalThread::Execute()
{
   ...
   Synchronize(UpdateCaption);
   ...
}
Run Code Online (Sandbox Code Playgroud)

但如果我这样做,我的编译器告诉我"E2268调用未定义的函数'同步'".当然我包括了图书馆:

#include <System.Classes.hpp>
Run Code Online (Sandbox Code Playgroud)

另一方面,编译器找到TThread :: Synchronize,但它不接受MainThreadID作为参数:

TThread::Synchronize(MainThreadID, MainForm->UpdateCaption );
Run Code Online (Sandbox Code Playgroud)

PS:我是C++ Builder的新手.

Rem*_*eau 5

Synchronize()是RTL TThread类的一种方法.在所有版本的C++ Builder中,TThread都有一个非静态版本Synchronize(),它是您展示的代码试图调用的版本.这需要TCriticalThread得出TThread,例如:

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

void __fastcall TCriticalThread::Execute()
{
   ...
   Synchronize(UpdateCaption);
   ...
}
Run Code Online (Sandbox Code Playgroud)

如果在您的情况下不是这种情况,那么TThread它的静态版本Synchronize()也可以与非派生的线程一起使用TThread,例如:

void __fastcall TCriticalThread::Execute()
{
   ...
   TThread::Synchronize(NULL, UpdateCaption);
   ...
}
Run Code Online (Sandbox Code Playgroud)