2014-06-24 18 views
3

我的环境:带或不带和用于C++ Builder中调用同步()

OS - 的Windows7专业版(32位)

IDE - RadStudio XE2 UPDATE4

我想知道关于同步()函数。

Synchronize()函数用于线程程序中。关于C++ Builder中使用的同步(),示例如下(如可以在here可以看出)

// 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(UpdateCaption); 

没有 “&” 函数名之前;

另外在Delphi代码作为here, 没有“&”函数名之前;

// Synchronize(UpdateCaption); 

所以,这是C++ Builder中使用同步()的正确方法

// Synchronize(UpdateCaption); 

// Synchronize(&UpdateCaption); 

我无论是在实际的代码试过,但似乎相同工作方式。 做UpdateCaption和& UpdateCaption函数的返回地址?

+2

,'UpdateCaption'和'&UpdateCaption'是非法的。这是一个C++ Builder扩展,对于成员函数,'&UpdateCaption'计算为'__closure',它是指向该对象上的对象和成员函数组合的指针。 (C++ 11增加了对语言的封闭;但是C++ Builder早有先例,所以他们不得不为它添加自己的扩展)。显然还有一个特性就是'UpdateCaption'在重载解析中隐式转换为'&UpdateCaption',尽管它本身并没有这样做! (例如'UpdateCaption;'给出错误)。 –

+0

@MattMcNabb:感谢您的评论。所以这是C++ Builder的扩展,而不是标准的C++。 – sevenOfNine

+0

是 - 标准C++(在C++ 11之前)没有关闭;您可以使用的唯一函数是非成员函数。 –

回答

4

因此,这是在C++助洗剂

//同步(UpdateCaption)使用同步()的正确方法;

//同步(& UpdateCaption);

他们都工作,但&是首选。

做UpdateCaption和& UpdateCaption函数的返回地址?

是。如果您在不指定参数列表的括号的情况下引用一个函数/方法,则假定函数/方法的地址。 &只是使它更加明确。标准C++中的

+0

对于一个成员函数,'f;'给出了一个错误,但'&f;'没有,所以它不是那么简单。看起来'f'只在特定的上下文中被转换为'&f'''(其中之一,至少被用作函数参数)。 –

+0

虽然在这个例子中还不清楚'UpdateCaption'是否是成员函数(如果它不是,那么它可以变成静态的,因为它实际上并不使用'this') –

+0

@MattMcNabb:'Synchronize()'需要成员方法(或现代版本中的匿名程序,但在C++中难以使用)。 'Synchronize(UpdateCaption)'和'Synchronize(&UpdateCaption)'之间的区别取决于编译版本。正如OP所说的,两者都在BCB6中工作,但是在更新的版本中已经改变了,所以用户应该总是只使用'Synchronize(&UpdateCaption)'。在代码中分配事件处理程序时也适用同样的规则,例如:Comp-> OnEvent = Handler;'Comp-> OnEvent =&Handler;' –