我有另一個question在我的PictureBox調用給我3種錯誤,一些偉大的答案特別來自Conrad Frix。所以它導致我找出我的問題在哪裏,但現在要解決它我不是100%確定。InvokeRequired在PictureBox上爲true。如何處理這個?
基本上我有一個Windows窗體計時器,它檢查某個事件是否爲真,如果是,那麼它告訴系統在事件(值)超過某個閾值2秒後發送一些數據。
我想我所有的計時器是創造我的PictureBox一個討厭的競爭狀態,我在幾個地方使用,以獲得從圖像:
new Bitmap(myPicBox.Image);
等等
我讀的地方定時器的時間間隔至少應該是50.從33開始。我發現我可以做一個picCapture.InvokeRequired來查看它是否會基本死亡。我知道我需要使用委託,但只使用這些設置的東西...不是從一個圖像...不知道如何設置...我知道是什麼確實造成它,這是這個碼組合:
private void timer1_Tick(object sender, EventArgs e)
{
if(someCOnditionTrue)
{
TimerCallback tc = new TimerCallback(sendDataFast); //only
//doing all this so i can have the method run two seconds after
// the condition is detected to be true.
System.Threading.Timer t = new System.Threading.Timer(tc, null, 2000, Timeout.Infinite);
}
}
void sendDataFast(Object stateObject)
{
//using this so the execution is not haulted while the sending of data takes place.
EmergencyDelegate delEmergency =
new EmergencyDelegate(mic.sendEmergencyData);
Image imgclone;
if (picCapture.InvokeRequired)
{
Console.WriteLine("HFS Batman! its going to die ");
}
lock (lockObject2) //i admit no clue what im doing here and doesn't seem to help.
{
Image img = picCapture.Image;
imgclone = (Image)img.Clone();
}
delEmergency.BeginInvoke(imgclone, null, null); //deep in the call to
//sendEmergencyData i get the **ParameterNotValid** almost everytime.
imgclone.Dispose(); //to free memory?
}
按照我剛纔的問題,似乎不再獲得在timer1_tick事件的內存問題或其他錯誤...(內存不足的錯誤是一個)。
我認爲最大的問題是如何處理picCapture.InvokeRequired當我需要它的圖像數據?我敢肯定它的我做了timer1_click內螺紋計時器調用引起此....
謝謝生病馬上檢查一下。我之前曾經使用過代表調用方法,但那是在我的「真正的工作」,我沒有代碼在這裏,所以不知道我在那裏做了什麼...已經有一段時間了。 – Codejoy 2010-09-13 06:19:25
@Jon:關於http://www.yoda.arachsys.com/csharp/threads/shutdown.shtml的例子,真的有必要在'停止'變量上使用鎖嗎?它似乎只能通過Stop()調用設置,並且永遠不會被取消設置。只是問,因爲我使用寫了一個非常類似的類,但我沒有鎖定我的等效停止變量。 – SomethingBetter 2012-01-05 21:40:16
@SomethingBetter:你可能需要它是易變的,或者你需要鎖定。否則,不能保證在一個線程中的集合會在另一個線程中看到。 – 2012-01-05 21:52:27