2013-10-23 8 views
5

Ho qualche problema con un evento. Il problema è che a volte l'evento non viene sollevato.C# Evento non generato e Thread

Abbiamo una fotocamera di un'azienda che abbiamo implementato nel nostro software. Nel software registriamo un evento che viene attivato ogni volta che un'immagine viene scattata sulla fotocamera.

Ho notato che con un aumento del fabbisogno in termini di potenza di elaborazione (ad esempio il calcolo della media media sulle immagini e il lavoro con immagini più grandi) a volte causerà l'evento che non viene generato. Inoltre, posso farlo accadere ancora più spesso aumentando il frame-rate della videocamera. So che manca un frame perché sono contrassegnati con ID.

Nel proprio software demo sono in grado di eseguire alla stessa velocità senza problemi. Il loro software non esegue calcoli o altro, riceve e visualizza solo l'immagine.

Sono sconcertato perché questa è la connessione più vicina alla fotocamera che ho; tutto quello che posso fare è aspettare che l'evento si alzi. Vorrei chiederti se sai di qualsiasi situazione in cui un evento verrebbe ignorato.

Per me sembra che la fotocamera stia scattando un'immagine, ma per qualche motivo il fatto che non cali (sovraccarico?).

Ecco parte del codice relativo:

private void Camera_OnFrameReceived(AVT.VmbAPINET.Frame frame) 
{ 
    if (frame.ReceiveStatus == VmbFrameStatusType.VmbFrameStatusComplete) 
    { 
     if (lastID != 0 && lastID != 1) 
     { 
      if(frame.FrameID - lastID > 1) 
       Debug.WriteLine("HEEEEYYY SKIPPED A FRAME, ID: " + frame.FrameID.ToString() + " TOTAL LOST: " + (frame.FrameID - lastID - 1).ToString()); 
     } 
     lastID = frame.FrameID; 
     //Debug.WriteLine("Frame received from camera"); 

     //if the camera is in single mode, dont raise the event (frame already taken) 
     if (Mode == CaptureMode.Single) 
      return; 

     //set the last frame 
     _frameQueue.Enqueue(frame); 

     if (FilmFrameReady != null) 
     { 
      DateTime dateTime = Accurate.DtNow; 
      frameTaken = false; 
      FilmFrameReady(this, new FilmFrameReadyArgs(this, dateTime)); 
     } 
    } 
} 

Come potete vedere prendo il telaio, inserirlo in una coda, e poi dire le mie classi di fuori che c'è qualcosa per loro di recupero. Sto rilasciando il thread dell'evento il più rapidamente possibile.

Sommario:

mio caso a volte non è sollevato. Penso che sia perché il thread principale sta lavorando troppo duramente.

Avete qualche esperienza con eventi a volte non sollevati?

+6

Sembra un problema con la lib di terze parti che stai utilizzando e non il tuo codice. Tuttavia, se potessi mostrare un codice che sarebbe un inizio ... – James

+0

Anche se così tanto fino a quando ho iniziato il loro programma dimostrativo e ha funzionato bene. Ho incluso del codice – Tallkotten

risposta

13

Le probabilità sono che tutti i gestori di eventi siano completi prima che il codice che attiva l'evento sia in grado di generare più eventi; probabilmente ha solo un singolo thread per sparare agli eventi. Quando ha un nuovo evento da attivare prima che l'evento corrente sia finito, può saltare l'evento (che è ciò che sembra fare) o accodarlo per dopo. Se lo fa, corre il rischio di essere molto indietro se i gestori di eventi impiegano quasi sempre più tempo rispetto al tempo tra un evento e l'altro. Ottenere dietro significa sia una quantità sempre maggiore di memoria consumata, sia il fatto che gli eventi sono stati lanciati per qualcosa che è successo un po 'di tempo fa, che (in alcuni contesti) può essere un problema.

Si può risolvere da soli avendo un gestore di eventi che in realtà non fa il lavoro, ma piuttosto mette le informazioni in una coda (a BlockingCollection andrebbe bene qui) in modo che un altro thread (o thread, se la vostra elaborazione può tranquillamente essere fatto in parallelo) in grado di elaborare gli articoli. Fai attenzione però, a meno che tu non accada solo occasionalmente "troppo lungo" per elaborare gli eventi, puoi finire con una coda che cresce e cresce, o semplicemente inonda la tua macchina con più thread di quanti ne possa gestire. Se solo occasionalmente prendi "troppo tempo", questo ti aiuterà anche senza creare un backlog.

Alla fine, se l'elaborazione richiede troppo tempo, potrebbe non esserci altra scelta che concentrarsi sul miglioramento delle prestazioni del gestore di eventi in modo che richieda meno tempo (in media) rispetto alla frequenza fotogrammi, oppure limiti appena il frame rate a cosa può gestire l'elaborazione.

+0

Scusa avrei dovuto includere del codice. Come puoi vedere nella mia domanda modificata, sto rilasciando il thread il più rapidamente possibile. – Tallkotten

+0

Sembra che abbia ancora ragione. Prima di ogni volta che manca un frame la funzione richiede da qualche parte tra 0,2-0,3 secondi alla fine, piuttosto che il normale 0,032-0,003 sec. Immagino che abbia a che fare con una parte che non ho mai incluso nel codice modificato "Camera.QueueFrame (frame);" Dove aggiungo di nuovo il frame ricevuto alla coda della videocamera. Devo controllare per essere sicuro però. – Tallkotten

+0

RISOLTO. Avevi ragione. – Tallkotten

Problemi correlati