2012-03-31 3 views
1

Visual C++ 2008 ProfessionalでC++/CLIを使用しています。私は静的関数LoginAccountsを呼び出そうとしていますが、おそらくManaged CodeとManagedを混在させているためにエラーが発生しますが、何をすべきか分かりません。私はWindows用のC++/CLIでエラーが発生しました.Pthreadを使用してデリゲートインスタンスを作成しないと機能のアドレスを取得できません。

System::Void testing_Click(System::Object^ sender, System::EventArgs^ e) { 
    pthread_create(&t, NULL, &Contas::LoginAccounts, this); //Error in this line 
} 

エラー13エラーC3374をpthreadのを使用しています: 'テスター::テスト:: 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(); 
     } 

答えて

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は()、ここではこの参照してhokeypokeyを行う必要インスタンスメソッドではありません。

実際にpthreadを使用したい場合は、Marshal :: GetFunctionPointerForDelegate()を使用して、デリゲートをネイティブコードに渡すことができるポインタに変換します。注意してください。委任オブジェクトは自分自身で参照する必要があります。ガベージコレクタは、ネイティブコードが保持する参照を参照することはできません。そして、あなたはまだに固定することなく渡すことはできません。これらは非常に醜いディテールで、単にThreadクラスを使用するだけで回避できます。

+1

"見て、あなたは委任オブジェクトを自分自身で維持しなければなりません。"これは 'gcroot'テンプレートを使ってC++/CLIで実現できます。 –

+0

私はあなたが私のマネージドスレッドを提案したように入れましたが、 "this->"を使ってエラーが出ました。私はスレッドで呼び出された関数の内部でこれを使ってエラーを表示するように質問を編集しました。 – Grego

+0

@AlexandreC。多分これが私がスレッドで呼び出される関数の中でthis->を使ってエラーになる理由だと思いますか?はいの場合、どうすればこの問題を解決できますか? – Grego

関連する問題