簡體   English   中英

Thread.Sleep和繪畫UI

[英]Thread.Sleep and Painting UI

我有一個交通信號燈程序,可以在我住的地方模擬一個奇怪的路口。 我很確定我有邏輯。 我有代表燈所有可能狀態的函數,包括黃色。 問題是我的黃燈都沒有畫。 一輛汽車停下來亮起燈五秒鍾,並且沒有其他汽車通過綠燈后,用於適當照明的黃燈應該點亮三秒鍾,然后變綠。 由於某些原因,當我逐步執行程序時,沒有黃色的燈在畫。 這是我的代碼:

private void WaitThreeSecs()
    {
        //somehow I think this is to blame
        int threeSeconds = 3000;
        Thread.Sleep(threeSeconds);
    }

    private void FromStateOneToTwo()
    {
        //Stop Countdown Timers
        fiveSec.Stop();
        thirtySec.Stop();

        //Indicate Current State
        CurrentState = 2;

        //Paint lights
        BottomGreen.Fill = gray;
        BottomYellow.Fill = yellow; // this never happens
        BottomRed.Fill = gray;

        //Wait 3 secs
        WaitThreeSecs();

        btnbottom.Content = "Car Stops";

        //Call function that changes the state for other lights to be green
        StateTwo();
    }

五秒鍾后將調用FromStateOneToTwo(),但是指示燈永遠不會發黃。 我不知道為什么這種情況不會發生。 從按下按鈕到適當的燈從紅色直變為綠色,燈會等待8秒鍾,這意味着我的3秒鍾計時器正在工作,但我的繪畫燈卻沒有工作。 (我完全像在這里一樣畫其他功能,並且工作正常)

如果需要,我可以顯示更多/全部代碼。

您不會遇到跨線程InvalidOperation異常,因此我假設所提供的函數在UI線程上運行。 如果您是通過單擊按鈕或DispatcherTimer的已過去事件來調用它,則將發生這種情況。

通過休眠UI線程,您不必花時間畫屏幕。 它先切換顏色,然后再切換,而無需運行任何繪制方法。

最好的解決方案是使用標准Timer這樣您就不必進入UI線程,然后使用Dispatcher.BeginInvoke (WPF)或Control.Invoke (WinForms)將對UI線程的更改編組。 您還可以消除Thread.Sleep並增加計時器以觸發下一個更改。

WaitThreeSecs()強制刷新屏幕之前使用Application.DoEvents

暫無
暫無

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

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