作者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
→ godman362:Sanbmp為B圖,Vanbmp為A圖 03/14 23:40
→ pico2k:Thread.Sleep(1000) 03/15 00:41
→ pico2k:Sleep的單位是"毫秒"... 03/15 00:45
→ godman362:我知道是毫秒,等1秒也是沒用 03/15 06:33
→ godman362:所以我想應該不會是Thread.Sleep的問題 03/15 06:33
→ pico2k:下中斷點去查,別用想的... 03/15 10:58
→ Lucemia:將picturebox相關的code移到progress report 試試 03/15 13:29
推 wesley412:應該要用INVOKE方式,我用圖片也都會這樣,才不會互爭~ 03/15 13:50
→ godman362:後來我已經試驗出來,是Duo core產生的race condition 03/15 18:56
→ godman362:在pictureBox1.Image = xxxx 03/15 18:56
→ godman362:結果另一個cpu去做下面那個存檔的動作 03/15 18:56
→ godman362:所以我後來是在pictureBox1.Image那行下面做了sleep 03/15 18:57
→ godman362:不過還是要感謝各位前輩給的建議 03/15 18:57