我想制作一个按备份文件压缩的程序,但是在压缩文件时程序会挂起。我尝试使用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真的很新。感谢
答案 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轻松实现多线程,但如果你使用它错了,那么你只会购买很多悲伤。首先练习这些示例,然后再使用自己的代码。