簡體   English   中英

Gui在使用線程時會凍結

[英]Gui freeezing when using threading

我被困住了,希望有人可以幫助我。

我已經制作了一個類/ gui,其中一個加載條設置為選框,以便在執行任務時我可以將其顯示給用戶。

在我的一個gui類中,在第一行的構造函數中,我正在創建此類的新實例然后執行

    LoadingBar bar = new LoadingBar();
    Thread thread = new Thread(bar.Show);
    thread.Start();

然而,即使主程序線程正在做一些更密集的東西,這個gui似乎仍然凍結,即使我使用backround worker。

我提到的方法有什么問題,如果有,我需要改變什么?

謝謝

你需要改變你的方法。 當工作在“工作線程”(通常是BackGroundWorker)中完成時,GUI需要保留在主線程中。 然后工作人員向GUI報告然后更新。

你最好做相反的事情。 在線程(或后台工作程序)中進行密集工作,並在主應用程序線程中顯示等待屏幕。

您需要使用BackgroundWorker 將一個拖到窗體上,單擊backgroundWorker1並將WorkerReportsProgress屬性設置為True

然后轉到事件(通過屬性窗口)並附加處理程序

  • DoWork ,這是進度條表示的所有工作。 您將通過此“報告進度”,后台工作人員將確保在UI線程上調用ProgressChanged。
  • ProgressChanged ,您可以根據報告給該方法的進度和狀態數據更新UI

DoWork事件看起來像這樣

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    var userState = new StateClass();

    while (working)
    {
        // TODO: do work here

        // update the state surrounding this task via userState
        userState.property = "some status";

        // report the progress so that backgroundWorker1_ProgressChanged gets called 
        this.backgroundWorker1.ReportProgress(percentComplete, userState);
    }

}

ProgressChanged事件看起來像這樣

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // e.UserState contains the state data you passed to ReportProgress, 
    //   you have to cast it to the right type though, since its of type object
    var userState = (StateClass)e.UserState;
    int progress = e.ProgressPercentage;

    // TODO: report progress to the UI with the above variables
}

現在你所要做的就是告訴后台工作者通過調用this.backgroundWorker1.RunWorkerAsync()來完成工作。

我不認為你在后台工作者中做你所有的工作,或者GUI不會凍結。 我們需要查看更多代碼,或者您需要再次查看后台工作程序示例以查看可能出現的問題。

編輯

添加對System.Threading.Thread.Sleep(1);的調用System.Threading.Thread.Sleep(1); 報告進度調用后

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM