2011-06-14 57 views
3

我有一個GUI窗口窗體。我想將圖像設置爲pictureBox,然後下一次睡眠3秒。設置GUI窗體和線程睡眠

pictureBox.Image = image; 
    Thread.Sleep(3000); 

但如果我這樣做我上面的代碼,我的形式嘗試設置圖像,旁邊睡覺3秒,只是我的形式繪製本身之後。所以我的照片在這3秒後顯示。我怎樣才能設置圖像,展示它,並在那之後「去睡覺」?

編輯1

正是我想要做這樣的事情:

我有兩個線程,UI和GUI。 UI從網絡套接字讀取並從GUI調用正確的方法。並且可以腳本這樣的:在GUI設置圖像

  • UI調用:在GUI

    • UI調用做一些事情(當時GUI必須清除圖像)

    但我想有肯定,我將能夠看到這個圖像。所以在GUI設置圖像之後,我將這個線程調用了3秒鐘。那麼,我該怎麼做呢?

    例子: (從GUI功能)

    public void f1() { 
        MethodInvoker method =() => { 
          pictureBox.Image = image; 
          pictureBox.Update(); 
          // do something more 
        }; 
    
        if (InvokeRequired) { 
          Invoke(method); 
        } else { 
          method(); 
        } 
    
    } 
    
    public void f2() { 
        MethodInvoker method =() => { 
          pictureBox.Image = null; 
          pictureBox.Update(); 
          // do something more 
        }; 
    
        if (InvokeRequired) { 
          Invoke(method); 
        } else { 
          method(); 
        } 
    
    } 
    

    與其他功能F3 ... FN

    public void f3() { 
        MethodInvoker method =() => { 
          // do something 
        }; 
    
        if (InvokeRequired) { 
          Invoke(method); 
        } else { 
          method(); 
        } 
    
    } 
    

    而且,我在我的UI線程調用函數f1和之後F2,我想以確保我的用戶能夠看到這張照片。但是,如果我的UI線程調用函數f1和一些之間的f3..fn正常調用它。

    編輯2

    不,我讓那: 我定義GUI形式的功能(這是由UI調用):

    public void f1() { 
         MethodInvoker method =() => { 
           pictureBox.Image = image; 
           pictureBox.Update(); 
         }; 
    
         MethodInvoker method2 =() => { 
           // something 
         } 
    
         if (InvokeRequired) { 
           Invoke(method); 
           Thread.Sleep(3000); // sleep UI thread 
           Invoke(method2); 
         } else { 
           method(); 
           method2(); 
         } 
        } 
    

    它的工作原理,但它不是最好的解決辦法。如果將這樣的腳本:

    - UI call f1 
    - UI call f3 
    

    用戶界面將睡3秒,我不指望它。

    什麼是我的問題的最佳解決方案?

  • +1

    把這個.Refresh()之前的睡眠。這不是最好的解決方案,但應該工作。 – 2011-06-14 22:09:47

    回答

    3

    嘗試其中之一:

    Form.Refresh(); 
    Application.DoEvents; 
    

    Application.DoEvents

    我假設WindowsForms。

    +0

    謝謝,它的工作;) – nirmus 2011-06-14 22:11:19

    +0

    哪個選項工作? (爲未來的讀者)。 [另外,通過接受答案,你讓其他人知道他們不需要回復。] – 2011-06-14 22:13:32

    +3

    重新繪製整個表格和所有控件是沒有意義的。 pictureBox.Update()是最好的。 DoEvents是最糟糕的。非常糟糕。 – 2011-06-14 22:14:48

    3

    你不應該讓你的圖形用戶界面睡眠。至少不是你正在做的事情。如果您使用Thread.Sleep或其他阻止機制,您將會阻止UI執行它想要做的事情;調度和處理消息。

    如果你真的想引起延遲行動,那麼你最好使用System.Windows.Forms.Timer。這是我認爲你需要做的。這當然是基於我對「入睡」的含義的模糊理解。

    • 設置你的圖片。
    • 然後立即禁用所有必要的控件,以模擬「入睡」意味着什麼。
    • 然後啓動計時器。
    • 最後在Tick事件中添加代碼,以反轉任何「進入睡眠」對您的意義。
    +0

    正是我想要做的事情:我有兩個線程,UI和GUI。 UI從網絡套接字讀取並從GUI調用正確的方法。並且可以是這樣的腳本: - 在GUI上調用UI:設置圖像 - 在UI上調用UI:執行某些操作(然後GUI必須清除圖像) 但是我想確保,我將能夠看到此圖像。所以在GUI設置圖像之後,我將這個線程調用了3秒鐘。那麼,我該怎麼做呢? PS。我如何在評論中添加新行? – nirmus 2011-06-14 23:15:52

    +0

    @nirmus:繼續並用這些附加信息編輯您的答案。你使用另一個線程的事實可能會徹底改變我的答案。如果您提供更多詳細信息,我們可能會提供更多幫助。 – 2011-06-15 01:27:24