さて、ほとんどの人がこの種の質問を見るとき、彼らは「ああ、デリゲートを使う」と思うことを知っています。さて、私はデリゲートを使用しています。そして、これは彼らと一緒に働くことを拒否するこれまでのところ唯一のコントロールです。また、BackgroundWorkerを使用していません。
System :: Threading :: Threadのラッパークラスを自分で作成しました。これは、それらを頻繁に使用することがわかっているためです。クラスにさまざまなデリゲートイベントを与えて、UIスレッドと対話できるようにしました。私は主にステータスバーのステータスを設定するためだけに使用しています。未使用のプログレスバーもあったので、追加したいと思いました。私はそれに委任を与えました、しかし私がそれを実行するとき、それは悪名高いものでクラッシュします:
System.Windows.Forms.dllで「System.InvalidOperationException」タイプの未処理の例外が発生しました
追加情報:クロススレッド操作が無効です:作成されたスレッド以外のスレッドからアクセスされたコントロール''。
私が知る限り、他のコントロールと同じようにデリゲートを使用しているため、今は混乱しています。これは特別ですか?私はインターネットを広範囲に検索しましたが、C#BackgroundWorkerの質問だけが表示されますが、これは実際には当てはまりません。これが私の代理人のコードです:
代表者:
delegate void OnThreadProgressUpdateDel(int progress, String^ status);
イベントを保持する変数:
OnThreadProgressUpdateDel^ m_updateProgressEvent;
イベントのバインド方法:
thread->OnThreadProgressUpdate += gcnew ObjectLoadThread::OnThreadProgressUpdateDel(this, &CObjectLoader::ProgressUpdate);
と呼ばれるイベント:
void CObjectLoader::ProgressUpdate(int progress, String^ status)
{
gGlobal->ProgramProgress->Maximum = 100;
gGlobal->ProgramProgress->Value = progress; //Crash here...
gGlobal->SetProgramStatus(status);
}
ここで呼び出されます:
m_updateProgressEvent->Invoke(1, "Loading objects...");
このばかげたToolStripProgressBarの何が特別なのか、更新したくないのです:(
Microsoft Visual C ++ 2008ExpressEditionでのC++CLR、Windowsフォームアプリケーションの使用。