今、ほとんどの人がこの種の質問を見ると、「ああ、代表者を使う」と思っています。さて、私はです。そしてこれはこれまでのところ彼らと一緒に働くことを拒否する唯一のコントロールです。私はBackgroundWorkerも使用していません。ToolStripProgressBarの値をスレッドから設定するにはどうすればよいですか?
私は自分自身で、System :: Threading :: Threadのラッパークラスを作成しました。私はクラスにさまざまなデリゲートイベントを与え、UIスレッドと対話できるようにしました。主にステータスバーのステータスを設定するために使用しています。私はまた未使用のプログレスバーを持っていたので、私はそれを追加したかったのです。私はそれをデリゲートを与えたが、私はそれを実行したときに、それがでクラッシュ悪名高い:
「System.InvalidOperationException」種類の未処理の例外が発生したのSystem.Windows.Forms.dllに
追加情報:クロススレッド操作が無効です:コントロール '' は、作成されたスレッド以外のスレッドからアクセスされました。
私が知っている限り、他のコントロールと同じようにデリゲートを使用しているので、私は今混乱しています。これは特別ですか?私は遠くに、インターネットを検索し、私が得るのは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);
}
はここに呼び出されます:
それはC++ CLRを使用して:(更新したくないになり、この愚かなToolStripProgressBarについてとても特別な何
m_updateProgressEvent->Invoke(1, "Loading objects...");
、WindowsはマイクロソフトのVisual C++ 2008 Express Editionの中で、フォームアプリケーション。
ToolStripProgressBarは 'Invoke'方法を持ちません。 'GetCurrentParent()'を使って 'Invoke'メソッドを取得できますか? 'InvokeRequired'でも同じことが言えます。 – smoth190
@ smoth190ホストフォームの場合でも、同じスレッドに存在するコンポーネントを使用できます。 –
ああ、良い。私はそれがうまくいくかどうかを確認するためにこのメソッドを実装します。 – smoth190