我的环境:
操作系统 - Windows7 Pro(32位)
集成开发环境 - RadStudio XE2 Update4
我对Synchronize()函数感到困惑。
Synchronize()函数在线程程序中使用。关于在C+ builder中使用Synchronize()的示例如下(可以在这里看到)。
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(&UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall TMyThreadClass::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
我有些困惑的是,在一些旧版本的C++ builder(比如bcb6)中,使用了Synchronize()方法。
// Synchronize(UpdateCaption);
函数名前不需要加上"&";
在Delphi代码中,与此处相同,函数名前也不需要加上"&"。
// Synchronize(UpdateCaption);
那么,在C++ Builder中使用Synchronize()的正确方法是什么呢?
// Synchronize(UpdateCaption);
或者
// Synchronize(&UpdateCaption);
我在实际代码中尝试了两种方法,但它们的工作方式似乎是一致的。 UpdateCaption和&UpdateCaption是否都返回函数地址?
UpdateCaption
和&UpdateCaption
是非法的。这是C++Builder的扩展,对于一个成员函数,&UpdateCaption
会被评估为一个__closure
,它是指向对象和该对象上的成员函数组合的指针。(C++11将闭包添加到语言中;然而,C++Builder早于此很长时间,因此他们不得不为其添加自己的扩展)。显然,还有一个特性,即在重载决议中,UpdateCaption
隐式转换为&UpdateCaption
,尽管它本身不会这样做!(例如,UpdateCaption;
会产生错误)。 - M.MSynchronize()
(和事件)特别依赖于Borland的__closure
扩展,它比MFP更灵活。MFP仅适用于特定类。闭包则不是这样,这使得将不同的类分配给相同的指向成员变量的指针成为可能。 - Remy Lebeau&FunctionName
是不起作用的。要获取一个成员函数指针,你必须写成&ClassName::FunctionName
的形式。 - M.M