2011-12-16 4 views
1

私はVC++ 2008フォームアプリケーションアンマネージドソケット通信コードを持っています。私はフォームに通信メッセージを表示したい。上記のエラーを回避するために、代理人メソッドを追加し、Invoke呼び出しを使用しました。しかし、私はまだ上記のエラーになります。誰でも私のコードを修正するのを助けることができますか?なぜ依然としてクロススレッド操作がデリゲートのInvokeで有効なエラーではないのですか?

これはをForm1ヘッダーファイルある:方法は別のクラスから呼び出される)

#include "stdafx.h" 
#include "SocketClientForm.h" 

using namespace SocketClientFormApp; 

void Form1::appendMsg(String^ msg) 
{ 
    updateHandler->Invoke(msg); 
} 

void Form1::updateLogMsg(String^ msg) 
{ 
    msgDisplayBox->AppendText(msg); 
} 

appendMsg(:これはをForm1のCPPファイルある

#pragma once 

#include "SocketClientMgr.h" 
class SocketClientMgr; 

namespace SocketClientFormApp { 

    public ref class Form1 : public System::Windows::Forms::Form 
    { 
    public: 
     Form1(void) 
     { 
      InitializeComponent(); 
      updateHandler = gcnew ProgressHandler(this, &SocketClientFormApp::Form1::updateLogMsg); 
     } 
    protected: 
     ~Form1() 
     { 
     } 
    private: 

#pragma region Windows Form Designer generated code 

     void InitializeComponent(void) 
     { 
     } 
#pragma endregion 

/////////////////////////////////// 

    private: delegate void ProgressHandler(String^ msg); 
    static ProgressHandler^ updateHandler; 

    public: void appendMsg(String^ msg); 
    public: void updateLogMsg(String^ msg); 
}; 
} 

別のスレッド

EIDT:

静的ProgressHandler^updateHandler。静的にすべきではない、それはプライベート

エラーがupdateLogMsg()で起こったあるべき enter image description here

答えて

2

デリゲートのInvoke(args)ちょうど現在のスレッドで実行されます。 someControlInstance.Invoke(delegate, args)(非常に一般的には "this.Invoke(...)")が必要です。これはメッセージループを使用してデリゲートコールをUIスレッドに転送し、スレッド間の問題を回避します。

等しく;

  • Delegate.BeginInvokeはThreadPoolのを使用
  • Control.BeginInvokeは、TEメッセージループを使用
関連する問題