我在Visual C ++ 2008 Professional上使用C ++ / CLI,因为我使用的是Windows Forms,这意味着我有托管代码而我正在尝试调用静态函数LoginAccounts,但是我收到错误可能是因为我将Managed与非托管代码混合,但我无法弄清楚该做什么。我正在使用PThread for Windows
System::Void testing_Click(System::Object^ sender, System::EventArgs^ e) {
pthread_create(&t, NULL, &Contas::LoginAccounts, this); //Error in this line
}
错误13错误C3374:除非创建委托实例,否则无法获取'Tester :: Test :: LoginAccounts'的地址
我该怎么做才能解决这个问题? 这可能是一个简单的解决方案,但我无法弄清楚。 提前谢谢。
void LoginAccounts(){
this->btn_next->Enabled = false;
this->login_accounts->Enabled = false; //Unhandled exception here
if(this->clb_contas->CheckedItems->Count <= 0){ //Unhandled exception here
}
}
System::Void testing_Click(System::Object^ sender, System::EventArgs^ e) {
ThreadStart^ start = gcnew ThreadStart(this, &Login::LoginAccounts);
Thread^ t = gcnew Thread(start);
t->Start();
}
答案 0 :(得分:5)
如果您只想调用托管代码,那么使用pthreads就没有意义了。请改用System :: Threading :: Thread类。您仍然需要创建错误消息抱怨的委托,委托是函数指针的托管等效项。有了铃声,它们不仅存储函数地址,还包装对象指针。使代码看起来类似于:
using namespace System::Threading;
...
private:
void LoginAccounts() {
// etc...
}
System::Void testing_Click(System::Object^ sender, System::EventArgs^ e) {
ThreadStart^ start = gcnew ThreadStart(this, &Form1::LoginAccounts);
Thread^ t = gcnew Thread(start);
t->Start();
}
注意LoginAccounts()在这里是一个实例方法,不需要使用 this 引用来执行hokeypokey。
如果你确实想要使用pthreads,那么使用Marshal :: GetFunctionPointerForDelegate()将委托转换为可以传递给本机代码的指针。注意,你必须保持自己引用的委托对象。垃圾收集器无法查看本机代码所持有的引用。如果没有固定,你仍然无法传递这个。这些是非常丑陋的细节,您可以通过简单地使用Thread类来避免这些细节。
答案 1 :(得分:0)
请在Calling PThread from Windows Form Class to a function inside the Windows Form Class查看我对您的另一个问题的回答。您可以使用与此相同的原则。