【发布时间】:2013-09-14 09:32:47
【问题描述】:
我正在为一个项目工作,在该项目中,pictureBox 用于一一显示目录中的图像。
首先我点击开始按钮。它调用一个 backgroundWorker 持续运行,直到我按下停止按钮。然后在 backgroundWorker 中,我调用了一个时间间隔为 500 毫秒的计时器。它调用一个事件处理方法。
在 evenhandler 方法中,我首先从目录中获取文件名,该文件名是数字并显示在名为“PicBox”的图片框中,然后递增,然后显示下一张图像。我使用了一个 while 循环来运行整个过程,直到我单击停止按钮。
问题是它在 500 毫秒(定时器间隔)后开始并以高速显示所有图片。我想以流的形式展示它们,这样用户就不会意识到这一切都是几个图像的组合,但不是以这种速度。
我使用了 Thread.Sleep(),但它冻结了 winform,我什至无法单击停止按钮。
PictureBox代码在这里:
if (_performReceiving)
{
try
{
while (_performReceiving)
{
switch (firstNum)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
PicBox.Image = Image.FromFile(path + "0" + firstNum + ".png");
this.PicBox.SizeMode = PictureBoxSizeMode.Zoom;
PicBox.Refresh();
firstNum++;
break;
default:
PicBox.Image = Image.FromFile(path + firstNum + ".png");
this.PicBox.SizeMode = PictureBoxSizeMode.Zoom;
PicBox.Refresh();
firstNum++;
break;
}
}
}
catch (FileNotFoundException)
{
MoveTimer.Stop();
}
}
有什么建议吗?
编辑:(代码的可视化视图)
Form class
{
start_button clicked()
{
//call backgroundWorker1
}
backgroundWorker1_DoWork()
{
//create Timer1_handler
//Timer1.Start()
}
Timer1_handler()
{
//Process to get firstNames numeric value which passes to switch parameter
:: This code posted on the main question ::
}
}
【问题讨论】:
-
不要阻塞gui线程?
-
@iabbott 这仅适用于 c/c++。用c#试试,会报
Control cannot fall through from one case label ('case 1:') to another编译错误。 -
嘿,有没有机会因为您在
BackgroundWorker中一遍又一遍地启动计时器,它会一遍又一遍地尝试加载图像? - 另外,为什么要启动计时器,如果您想在线程中的特定点更改图像,然后委托 GUI 加载新图像,然后将其硬编码到线程中。 -
@NewBiL 与其让计时器的滴答声使用
While来添加所有图像,不如每个滴答声事件只做一个,然后调整计时器的间隔,以便以您想要的速度添加图像。计时器的间隔实际上变成了您通常睡觉的时间。 -
@NewBiL 我不会浏览整个代码库的大量转储,其中大部分无关。如果您可以将您的问题简化为一个可以演示您的问题并且不包含无关代码的简短但有效的示例,那么值得一看。
标签: c# multithreading winforms image picturebox