这是关于从另一个线程更新UI的系列中的第二个问题。我试图使用委托告诉UI执行更新功能(不需要传递数据)。我在UI线程中创建了一个委托,并在UI线程上声明了它:
delegate void MyDel();
public ref class Form1 : public System::Windows::Forms::Form
{
// .....
void testFunc()
{
this->local_long_textBox->Text = "Test!!!!!!!";
}
private:
void startUp()
{
MyDel^ DelInst = gcnew MyDel(this,&CotStinger::Form1::testFunc);
我想在创建时将DelInst传递给另一个线程,但是当我尝试在另一个模块的顶部将MyDel声明为这样的extern:
extern delegate MyDel;
我收到错误:
错误C2146:语法错误:在标识符
';'
之前缺少'MyDel'
。
如果我试试这个
extern delegate void MyDel();
我收到错误:
错误C2144:语法错误:
'void'
前面应加';'
那么如何让其他类识别委托类型,以便将委托指针传递给构造函数?
答案 0 :(得分:2)
delegate
关键字用于定义委托类型,而不是声明恰好是某种委托类型的变量。即,一旦定义了委托类型,您在任何时候都不需要delegate
关键字。
此外,C ++ / CLI中不允许使用托管类型的全局变量;通常的解决方法是使用逻辑静态托管类,其中公共静态数据成员充当全局变量:
delegate void MyDel();
private ref struct Globals abstract sealed
{
static MyDel^ MyDelInstance;
};
// ...
Globals::MyDelInstance = gcnew MyDel(this, &CotStinger::Form1::testFunc);
那么如何让其他类识别委托类型,以便将委托指针传递给构造函数?
与任何其他类型相同 - 将其放在头文件中,两个类都可以#include
。