作者godman362 (青)
看板C_Sharp
标题[问题] backgroundworker
时间Sun Mar 14 23:39:09 2010
想请教各位一个问题
我目前有一份处理影像的程式
目的是要做出一个小动画
就是有两张图,在400 * 300的范围要呈现出来
一开始是A图,B图会由左至右把A图推出去,而且每推一次必须存成一张图片
(A、B图皆为400 * 300)
共150次,所以要存成150张图档
因为影像处理时间较久,於是丢给backgroundworker处理
以下是我的程式码:
Bitmap Sample = new Bitmap(400, 300);
for (int frame = 0; frame < 150; frame++)
{
switch (frame % 3)
{
case 0:
shift += 2;
break;
case 1:
case 2:
shift += 3;
break;
}
for (int i = 0; i < shift; i++)
{
for (int j = 0; j < 300; j++)
{
Sample.SetPixel(i, j, Sanbmp.GetPixel(400 - shift + i, j));
}
}
for (int i = 0; i < 400 - shift; i++)
{
for (int j = 0; j < 300; j++)
{
Sample.SetPixel(shift + i, j, Vanbmp.GetPixel(i, j));
}
}
pictureBox4.Image = Sample;
pictureBox4.Image.Save(frame.ToString() + ".bmp");
progressBar1.Increment(1);
Thread.Sleep(50);
}
那我的问题在於,我没有做存档的动作时,程式是正常的跑完
但是一加了存档那行之後,便一直跟我说「某些地方正在使用物件」的Error
我在想是不是Thread速度太快,抢了sample这块Bitmap
於是我加了Thread.Sleep降缓一下速度,不过结果也是一样
我所使用的电脑为Duo core,会有影响吗?
还请各位指教一下,谢谢
--
Ultimate Treein
ˍˍ
▕慕京▏
▕子印▏
 ̄ ̄
http://septemhill.blogspot.com
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.118.10.191
1F:→ godman362:Sanbmp为B图,Vanbmp为A图 03/14 23:40
2F:→ pico2k:Thread.Sleep(1000) 03/15 00:41
3F:→ pico2k:Sleep的单位是"毫秒"... 03/15 00:45
4F:→ godman362:我知道是毫秒,等1秒也是没用 03/15 06:33
5F:→ godman362:所以我想应该不会是Thread.Sleep的问题 03/15 06:33
6F:→ pico2k:下中断点去查,别用想的... 03/15 10:58
7F:→ Lucemia:将picturebox相关的code移到progress report 试试 03/15 13:29
8F:推 wesley412:应该要用INVOKE方式,我用图片也都会这样,才不会互争~ 03/15 13:50
10F:→ godman362:後来我已经试验出来,是Duo core产生的race condition 03/15 18:56
11F:→ godman362:在pictureBox1.Image = xxxx 03/15 18:56
12F:→ godman362:结果另一个cpu去做下面那个存档的动作 03/15 18:56
13F:→ godman362:所以我後来是在pictureBox1.Image那行下面做了sleep 03/15 18:57
14F:→ godman362:不过还是要感谢各位前辈给的建议 03/15 18:57