[問題] backgroundworker

看板C_Sharp作者 (青)時間16年前 (2010/03/14 23:39), 編輯推噓1(1013)
留言14則, 4人參與, 最新討論串1/1
想請教各位一個問題 我目前有一份處理影像的程式 目的是要做出一個小動畫 就是有兩張圖,在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

03/14 23:40, , 1F
Sanbmp為B圖,Vanbmp為A圖
03/14 23:40, 1F

03/15 00:41, , 2F
Thread.Sleep(1000)
03/15 00:41, 2F

03/15 00:45, , 3F
Sleep的單位是"毫秒"...
03/15 00:45, 3F

03/15 06:33, , 4F
我知道是毫秒,等1秒也是沒用
03/15 06:33, 4F

03/15 06:33, , 5F
所以我想應該不會是Thread.Sleep的問題
03/15 06:33, 5F

03/15 10:58, , 6F
下中斷點去查,別用想的...
03/15 10:58, 6F

03/15 13:29, , 7F
將picturebox相關的code移到progress report 試試
03/15 13:29, 7F

03/15 13:50, , 8F
應該要用INVOKE方式,我用圖片也都會這樣,才不會互爭~
03/15 13:50, 8F

03/15 13:51, , 9F
http://jasperlu.blogspot.com/這一個把字串改成picBox
03/15 13:51, 9F

03/15 18:56, , 10F
後來我已經試驗出來,是Duo core產生的race condition
03/15 18:56, 10F

03/15 18:56, , 11F
在pictureBox1.Image = xxxx
03/15 18:56, 11F

03/15 18:56, , 12F
結果另一個cpu去做下面那個存檔的動作
03/15 18:56, 12F

03/15 18:57, , 13F
所以我後來是在pictureBox1.Image那行下面做了sleep
03/15 18:57, 13F

03/15 18:57, , 14F
不過還是要感謝各位前輩給的建議
03/15 18:57, 14F
文章代碼(AID): #1BdGCW8_ (C_Sharp)