好長時間沒發博了 。。
這兩天用C#寫了一個批量分割圖片前景的軟件,最初的時候沒用多線程,執行批量分割就假死,后來就換成了多線程,結果還是假死。。
網上找了幾篇博文看了看,才發現錯誤的地方。
好了,首先看不合理的情況。
winform跨線程更新ui。
//點擊按鈕開始工作
private void btnStartWorking_Click(object sender, EventArgs e)
{Thread multi = new Thread(new ThreadStart(StartWork));multi.IsBackground = true;multi.Start();
}//定義一個委托
private delegate void DelegateFunction();//執行函數void StartWork()
{if (this.progressBar.InvokeRequired){DelegateFunction df = new DelegateFunction(StartMultiWork);this.Invoke(df);}else{ progressBar.Maximum = 10000;for (int i = 1; i <= 10000;i++ ){//...........//在這里執行一個非常非常耗時的函數 DoLongTimeWork()DoLongTimeWork();//...........progressBar.Value = i;Application.DoEvents(); //讓主窗體去執行消息列隊的其他指令}}}
下面這樣就行了
//點擊按鈕開始工作
private void btnStartWorking_Click(object sender, EventArgs e)
{Thread multi = new Thread(new ThreadStart(StartWork));multi.IsBackground = true;multi.Start();
}//定義一個委托
private delegate void DelegateFunction(int ipos);//執行函數void StartWork()
{ //設置進度條最大值 this.progressBar.Maxmum = 10000;for (int i = 1; i <= 10000;i++ ){//...........//在這里執行一個非常非常耗時的函數 DoLongTimeWork()DoLongTimeWork();//...........SetPos(i); //關鍵就在這里,只有將要更改progressBar的value的時候 才去Invoke 這樣就不會一直占用著主界面的刷新 }
}
//設置進度條的Value
private void SetPos(int ipos)
{if (this.progressBar.InvokeRequired){DelegateFunction df = new DelegateFunction(StartMultiWork);this.Invoke(df,new object[]{ipos});}else{ProgressBar.Value = Int32.Parse(ipos);}}
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态