Bonjour,
je ne suis pas un expert dans le multhreading et j'aurais donc voulu savoir s'il fallait faire des choses spécifiques pour que la méthode WaitForSingleObject( H_mutex , 0 ) retourne l'évènement WAIT_ABANDONED.
Pour le moment quand mon mutex est pris par un autre thread, en retour j'ai WAIT_TIMEOUT.
Declaration de mon Mutex:
--------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part H_mutex_RAZ = CreateMutex(NULL, FALSE, "MRAZ");
Boucle de mon thread de travail:
-------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 while( ((tCourant - mTpsDebutMS) < mDureeMS) && (Terminated == false) ) { vResWaitMutex = WaitForSingleObject( H_mutex_RAZ , 0 ); switch( vResWaitMutex ) { case WAIT_ABANDONED : vFichierTrace << "WaitForSingleObject = WAIT_ABANDONED" << endl; usb->acquerrir(vTabData); break; case WAIT_OBJECT_0 : vFichierTrace << "WaitForSingleObject = WAIT_OBJECT_0" << endl; for(int iV = 0; iV < mNbVoie; ++iV) { SONWriteADCBlock(mHFile, iV, vTabData, vLgBuff, mCptData*vLgBuff); } ++mCptData; ReleaseMutex( H_mutex_RAZ ); break; case WAIT_TIMEOUT : vFichierTrace << "WaitForSingleObject = WAIT_TIMEOUT" << endl; break; case WAIT_FAILED : vFichierTrace << "WaitForSingleObject = WAIT_FAILED" << endl; break; default : vFichierTrace << "WaitForSingleObject = default" << endl; break; } tCourant = GetTickCount(); }
Thread de RAZ prenant le mutex:
--------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 WaitForSingleObject( H_mutex_RAZ , INFINITE ); mCptData = 0 ; SONCommitFile(mHFile, true); SONEmptyFile( mHFile ); SONSave(mHFile, -1, 0, true); Sleep(5000); // pour test de WaitForSingleObject ReleaseMutex( H_mutex_RAZ );
Tout ceci est un prog de test.
Dans la réalité, pendant que mon thread de RAZ s'execute, le thread de travail doit continuer à faire de l'acquisition de données sur l'USBafin d'éviter un engorgement au niveau de FIFO liées à l'USB.
Merci
Partager