[英]C# Threading Bitmap objects/PictureBox
我有一些代碼來顯示視頻樣點移動的圖形。
我將這些點寫入位圖,並將其放置在圖片框上。
圖形計算必須在其自己的線程上完成。 只要您不要將窗口移得太多,圖形就可以正常工作。
我正在使用winforms。 當我運行代碼並瘋狂地移動窗口時,有時會出現以下錯誤:
@ this.Invoke(d,new object [] {bmp}); “無法訪問已處置的對象。對象名稱:'Form1'。”
@ gfx.DrawImage(bmpDestination,new Point()); “對象當前正在其他地方使用。”
這是代碼:
private void button2_Click(object sender, EventArgs e)
{
Thread demoThread = new Thread(new ThreadStart(ThreadProcSafe));
demoThread.Start();
}
private void ThreadProcSafe()
{
creategraphics();
}
private void creategraphics()
{
Bitmap bmpDestination = new Bitmap(988, 588);
Bitmap bmp = new Bitmap(988, 588);
for (int i = 0; i < numtimesteps; i++)
{
bmp = GraphingUtility.create(apple, i, 988, 588, -30, 30, -30, 30);
using (Graphics gfx = Graphics.FromImage(bmp))
{
gfx.DrawImage(bmpDestination, new Point());
}
bmpDestination = bmp;
updateimage(bmp);
}
}
delegate void graphicscallback(Bitmap bmp);
private void updateimage(Bitmap bmp)
{
if (pictureBox1.InvokeRequired)
{
graphicscallback d = new graphicscallback(updateimage);
this.Invoke(d, new object[] { bmp });
}
else
{
pictureBox1.Image = bmp;
pictureBox1.Refresh();
}
}
跨線程使用GDI對象存在問題。
在此主題中查看Hans的雙克隆建議。
無法訪問已處置的對象。 對象名稱:'Form1
之所以會這樣,是因為您在用戶關閉表單時不執行任何操作來停止線程。 您必須保持活動狀態,直到您知道線程已死。 很難做到可靠,請查看此答案以獲取解決方案。
順便說一句,調用InvokeRequired是一種反模式。 您知道您正在通過工作線程進行調用。 如果InvokeRequired將返回false,則說明確實存在錯誤。 不要打擾,直接調用Invoke()。
當前在其他地方使用對象
當看到兩個線程試圖同時訪問位圖時,這是GDI +(圖形)提出的異常。 這在您的代碼段中並不明顯,但是我看不到GraphingUtility.create()的作用。 確保它創建一個新的位圖,而不返回現有的位圖。 因為這將在您的線程再次向其寫入並且圖片框同時重新繪制自身時炸彈。 您在上面使用的bmp構造函數沒有任何作用。
您的PictureBox.Image分配忘記處理舊的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.