Bonjour,
Je suis face à un gros problème. J'ai un thread dans lequel je capture des images à une cadence fixe (30 ms). Voici sa structure:
Pour démarrer ou stopper celui-ci j'ai respectivement les fonctions StartThread et StopThread.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void MyThread(void) { Create(); while(StopThread_b == false) { Capture(...); UpdateInterface(...); /* frame number, etc */ } Destroy();
Mon problème:
Je veux stopper la capture après un certain temps. J'ai donc créé un timer qui met la variable StopThread_b à true après x millisecondes.
C'est là qu'est mon problème parfois ma thread se coupe parfois pas! En effet pour mettre à jour mon interface (principalement des labels), j'appelle mes fonctions de manière asynchrone via des delegate:
Pour éviter les surcharges, je récupère un IAsyncResult depuis la méthode BeginInvoke pour mettre un délai maximum au traitement de la mise à jour de mon interface:
Code : Sélectionner tout - Visualiser dans une fenêtre à part this->BeginInvoke(...)
On dirait que c'est là qu'est mon problème quand le timer est déclenché et qu'il stoppe le thread, mon interface continue de se mettre à jour... En fait on dirait que mon programme est en train d'afficher toutes mes appels asynchrones qui étaient pending... Comment les annuler?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 IAsyncResult^ tag = this->BeginInvoke(...); tag->WaitHandle->WaitOne(50, true);
J'ai bien essayé d'utiliser un:
mais ça ne résoud pas le problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Application::DoEvents
le Thread->Abort fonctionne mais je préférerai évitervu que je dois bien m'assurer de tout nettoyer à la fin du thread (Destroy).
Il doit bien y avoir une solution!
Partager