在VC ++ 2010中使用backgroundworker

时间:2011-02-02 21:10:15

标签: .net visual-c++ c++-cli backgroundworker

我想制作一个按备份文件压缩的​​程序,但是在压缩文件时程序会挂起。我尝试使用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();
     }

这是我的后台工作人员的DoWork代码:

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

我发现refreshAll()将无法运行,我无法分辨线程何时停止,我认为我在这里做错了,你能给我一些提示吗,我对CLR真的很新。感谢

2 个答案:

答案 0 :(得分:3)

如果RefreshAll对GUI进行更改,则必须注意以下规则:

永远不要从创建Gui的主线程之外的其他线程更改GUI。

在这种情况下,您必须使用Form :: Invoke方法切换到主线程,如

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

当然,你必须创建一个委托RefreshAllDelegate。

答案 1 :(得分:1)

在RunWorkerAsync()之后删除所有代码,只有当用户在进行压缩时关闭表单时,它才会使您的应用程序崩溃。在DoWork()方法中,使用bgw的ReportProgress()方法报告进度。您可以为事件编写事件处理程序以更新UI。将refreshAll()移动到bgw的RunWorkerCompleted事件处理程序中。

查看为BackgroundWorker提供MSDN Library文章的示例。 BGW旨在使用UI轻松实现多线程,但如果你使用它错了,那么你只会购买很多悲伤。首先练习这些示例,然后再使用自己的代码。