Я использую этот PictureBox в форме, в этом графическом окне я использую код AForge.Я передаю ССЫЛКУ pictureBox в класс веб-камеры, который я создаю, который инициализирует веб-камеру и сообщает ей, куда рисовать ее кадры ... так что он счастливо рисует ее кадры ... без проблем.
Но тогдаопределенное время (когда я хочу что-то сделать с указанным изображением, если нажата кнопка chck) ... я запускаю этот таймер, используя простой код:
timer1.Enabled = true;
этот интервал таймера установлен равным 33.
Так что теперь он запускается и каждый раз через цикл мой код имеет следующее:
private void timer1_Tick(object sender, EventArgs e)
{
...
double value = detector.ProcessFrame(new Bitmap(picCapture.Image)); //errors here
...
TimerCallback tc = new TimerCallback(sendDataFast);
System.Threading.Timer t = new System.Threading.Timer(tc, null, 2000, Timeout.Infinite);
}
В этой строке выше есть одна из трех ошибок, которые я видел (трассировки стека, где это возможно):
Object is currently in use elsewhere.
Out of Memory.
(A first chance exception of type 'System.OutOfMemoryException' occurred in System.Drawing.dll)
Parameter not valid
(A first chance exception of type 'System.ArgumentException' occurred in System.Drawing.dll)
Я уверен, что это проблемы с многопоточностью, но я понятия не имею, как их решать...Я полностью потерянЕсли программа зависает в этой строке выше, я обычно могу нажать снова запустить в отладчике, и все в порядке.Но я не хочу быть неряшливым и просто поймать уловку, которая продолжается.Я хотел бы выяснить корень этой проблемы ..
Я видел где-то еще, кто-то сказал, что это может быть проблема с многопоточностью и поставить эту строку: System.Diagnostics.Debug.Assert (! This.InvokeRequired,"InvokeRequired");
Так что я сделал в начале этого метода time1_click, но кажется, что assert не происходит, но я не уверен, что это было правильное место для assert ... является timer1_clickв потоке пользовательского интерфейса или нет?
Теперь я подозреваю, что я проверил свой код на предмет того, как я инициализирую класс своей веб-камеры:
Или в пределах этого timer1_click я также вызываю этот метод:
void sendDataFast(Object stateObject)
{
EmergencyDelegate delEmergency =
new EmergencyDelegate(mic.sendDataEmergency);
// call the BeginInvoke function! //sendDataEmergency takes in a picture Image picImage as an argument.
delEmergency.BeginInvoke(picCapture.Image, null, null);
}
И для полноты вот как я инициализирую класс своей веб-камеры:
webcam = new WebCam();
webcam.InitializeWebCam(ref picCapture, ref picComparator, ref dataObject, this); //guessing this is calling threading issues
Эти три ошибки, которые происходят не сразу, похоже, происходят случайно, одна изтри .... заставляет меня думать, что это проблема многопоточности, но как еще я могу это исправить?по какой-то причине создаете делегат, который возвращает это двойное значение и вызывается, если invoke required is true?