C++/CLI 参数化线程启动问题

C++/CLI Parametrized Thread Start problems

我正在编写一个带线程的示例程序。我有一个名为 CamThread 的 class 在 CamThread.h

中定义如下
public ref class CamThread{

public:
    CamThread();
    void takeImages();

private:
    Driver^ driver;
};

CamThread.cpp 文件看起来像:

using namespace System::Threading;

CamThread::CamThread(){

Driver^ newdriver;
newdriver = (Driver^)gcnew ZylaDriver();
newdriver->initCamera();

Thread^ acquireThread = gcnew Thread(gcnew ParameterizedThreadStart(this,&CamThread::takeImages));
acquireThread->Start;
};

void CamThread::takeImages(){
//Additional code.}

主要功能是

int main(int argc, char* argv[]) {

CamThread^ cameraThread = gcnew CamThread();

cout << endl << "Press enter to close" << endl;
cin.ignore();
return 0;
}

我遇到的问题是,在 CamThread.cpp Visual Studio 2013 中,ParameterizedThreadStart 中的 &CamThread::takeImages 存在问题。它给了我 "Error: Invalid delegate initializer -- function does not match the delegate type".

我似乎错误地构造了委托 &CamThread::takeImages,但我发现的许多示例似乎都使用了类似的构造(例如 https://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart%28v=vs.110%29.aspx)。

我一直找不到其他好的例子。

ParameterizedThreadStart class 要求委托有一个参数。 所以 takeImages 方法应该声明为:

void takeImages(Object^obj)

因此,当你想要启动线程时,需要传递一个参数:

acquireThread->Start(someParameter);

但是如果你不需要传递参数,那么只需要保持方法 takeImages 不变,并使用 ThreadStart 而不是 ParameterizedThreadStart 创建线程:

Thread^ acquireThread = gcnew Thread(gcnew ThreadStart(this, &CamThread::takeImages));

并开始:

acquireThread->Start();
dt->ColumnChanging += gcnew DataColumnChangeEventHandler(this, Project1::MyForm::ppp);

然后

private: void ppp(System::Object^  sender, System::Data::DataColumnChangeEventArgs^ e)
{

}

That is DataColumnChangeEventArgs matches with DataColumnChangeEventHandler.