Mam aplikację pulpitu C#, w której jeden wątek tworzony przeze mnie stale pobiera obraz ze źródła (faktycznie jest to aparat cyfrowy) i umieszcza go na panelu (panel. image = img) w GUI (który musi być inny wątek, ponieważ jest to kod z opóźnieniem z kontrolą.InvalidOperationException - obiekt jest obecnie w użyciu w innym miejscu - czerwony krzyż
prace aplikacji, ale na niektórych maszynach pojawia się następujący błąd w losowych odstępach czasu (nieprzewidywalne)
************** Exception Text **************
System.InvalidOperationException: The object is currently in use elsewhere.
Następnie panel zamienia się w czerwony krzyż, czerwony X - uważam, że jest to nieprawidłowa ikona obrazu, którą można edytować z właściwości. Jon działa, ale panel nigdy nie jest aktualizowany.
Z tego co wiem, ten błąd pochodzi z zdarzenia kontrolnego, w którym narysowałem coś innego na obrazie.
Próbowałem za pomocą zamka tam, ale nie szczęścia :(
Sposób I wywołać funkcję, która stawia obraz na panelu jest następujące:
if (this.ReceivedFrame != null)
{
Delegate[] clients = this.ReceivedFrame.GetInvocationList();
foreach (Delegate del in clients)
{
try
{
del.DynamicInvoke(new object[] { this,
new StreamEventArgs(frame)});
}
catch { }
}
}
to delegat:
public delegate void ReceivedFrameEventHandler(object sender, StreamEventArgs e);
public event ReceivedFrameEventHandler ReceivedFrame;
i to, w jaki sposób funkcja wewnątrz kontroli kodu źródłowego rejestruje do niego:
Camera.ReceivedFrame +=
new Camera.ReceivedFrameEventHandler(camera_ReceivedFrame);
Próbowałem też
del.Method.Invoke(del.Target, new object[] { this, new StreamEventArgs(b) });
zamiast
del.DynamicInvoke(new object[] { this, new StreamEventArgs(frame) });
ale nie szczęścia
Czy ktoś wie jak mogę naprawić ten błąd lub przynajmniej złapać błąd jakoś i zrobić nić ponownie umieścić obrazy na panelu?
Aktualizuję panel w głównym wątku, ale wywołuję funkcję, która aktualizuje go z innego wątku i przekazuje obraz jako parametr. –
jeśli wywołasz funkcję, która aktualizuje panel z innego wątku i samej funkcji, nie ma przełączania kontekstu (przełącz się na główny wątek, używając na przykład invoke) oznacza to, że twoja aktualizacja została wykonana na innym wątku, a nie głównym wątku –