2011-06-14 92 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