2

我希望在转换器处理时显示 GIF 图像。但是 GIF 图像从不显示,并且转换器过程成功完成,大约需要 20 秒,因此图片框是空白的。如果我用 MessageBox.Show 替换转换器进程,则 Gif 图像和 Message.Show 都可以正常工作。

我需要做什么?

Thread th = new Thread((ThreadStart)delegate                  
{
    pictureBox1.Image = Image.FromFile("loading_gangnam.gif");                                 
    Thread.Sleep(5000);
});

th.Start(); 

//MessageBox.Show("This is main program");
Converted = converter.Convert(input.FullName, output);
4

4 回答 4

3

UI 的绘制是在绘制事件期间完成的,只有在您的代码完成任何考虑的事情时才会处理该事件。

此外,您当前的代码已损坏。您永远不PictureBox应该从工作线程操作 UI 控件(例如 a )。这会导致“检测到跨线程操作”(或类似)异常。

选项:

  • 处理图像的一部分,然后让它绘画,并安排一个计时器或其他事件来立即继续绘画
  • 在隔离(非 UI)图像上的后台线程上执行工作,定期制作当前工作图像的副本,并用于pictureBox1.Invoke(...)副本设置图片框的内容。

还有一种明确的方法可以让事件在 UI 循环中进行处理,但这确实是一种糟糕的做法,我什至无法直呼其名。

于 2012-12-19T07:09:25.303 回答
1

您正在从不同于主 UI 线程的线程访问表单控件。您需要使用 Invoke()。

有关示例,请参见此处

于 2012-12-19T07:08:29.650 回答
1

你把线弄反了。您希望您的 UI 线程立即显示 GIF,但转换在新线程上运行。应该是这样的:

Thread th = new Thread((ThreadStart)delegate                  
{
    Converted = converter.Convert(input.FullName, output);
});
th.Start(); 

// should probably check pictureBox1.InvokeRequired for thread safety
pictureBox1.Image = Image.FromFile("loading_gangnam.gif");   

进一步阅读: http: //msdn.microsoft.com/en-us/library/3s8xdz5c.aspx http://msdn.microsoft.com/en-us/library/ms171728.aspx

于 2012-12-19T07:17:34.887 回答
0

试试这个函数来设置 loading_gangnam.gif 图像:

public void newPicture(String pictureLocation)
{
    if (InvokeRequired)
    {
        this.Invoke(new Action<String>(newPicture), new object[] { pictureLocation });
    }
    pictureBox1.Image = Image.FromFile(pictureLocation);
    pictureBox1.Refresh();
}

我正在处理的项目有几个线程都访问相同的表单,这对我有用!

于 2012-12-19T08:13:11.110 回答