2011-02-02 15 views
0

バックアップファイルで圧縮するプログラムを作成したいが、ファイルを圧縮するときにプログラムがハングする。私はバックグラウンドワーカーを使って作業を実行しようとしました。VC++ 2010でbackgroundworkerを使用

これはこれまでのところ私のコードです:

private: System::Void threadTest_Click(System::Object^ sender, System::EventArgs^ e) { 
     debug->Text = L"Zipping..."; 
     zip->RunWorkerAsync(); 
     if(zip->IsBusy) 
     { 
      bkProgress->Increment(20); 
      Application::DoEvents(); 
     } 
     //zip->OnDoWork(); 
    } 

は、これは私のBackgroundWorkerのためDoWorkコードです:

private: System::Void zip_DoWork(System::Object^ sender, System::ComponentModel::DoWorkEventArgs^ e) { 
      //zipping file code here 
      refreshAll(); 
    } 

私はrefreshAll()が実行されず、ときに私が言うことができないことが判明スレッドが停止している、私はここで何か間違っていたと思う、あなたは私にいくつかのヒントを与えることができます、私は本当にCLRの新しいです。おかげ

答えて

3

RefreshAllがGUIに変更を加えた場合、あなたは以下のルールに世話をする必要があります。

は、GUIを作成したメインスレッド以外のスレッドからGUIを変更することはありません。

あなたはあなたがその

this->Invoke(gcnew RefreshAllDelegate(), new Object[] { message }); 

のようにメインスレッドに切り替えるためにフォーム:: Invokeメソッドを使用する必要がありますそしてもちろん、あなたがデリゲートRefreshAllDelegateを作成する必要がありますケース。

+0

ありがとうございます。申し訳ありませんがこの質問を説明してください。これは私が必要とするものです。 – r1cebank

1

RunWorkerAsync()の後にすべてのコードを削除すると、ジップが進行中にユーザーがフォームを閉じるときにアプリケーションがクラッシュするだけです。 DoWork()メソッドでは、bgwのReportProgress()メソッドを使用して進行状況を報告します。 UIを更新するイベントのイベントハンドラを記述することができます。 refreshAll()をbgwのRunWorkerCompletedイベントハンドラに移動します。

MSDNライブラリ記事にBackgroundWorkerの例を見直してください。 BGWは、UIを使ったマルチスレッド化を容易にするように設計されていますが、間違って使用している場合は、多くの悲しみを買うだけです。最初の例は、自分のコードで動作させる前に練習してください。

関連する問題