Bonjour,
Voilà, je me renseigne depuis 9h30 ce matin sur les threads (l'idée est d'arrêter la boucle for de ma fonction "PLAYSEQUENCE" quand on appuie sur "STOP" et apparemment, c'est le seul moyen).
Voilà la fonction Playsequence
dans CMySequence (elle est appelée d'une autre classe liée à ma boîte de dialogue).
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 void CMySequence::PlaySequence(int m_iFrom, int m_iTo, int m_iSpeedPlay, BOOL m_bBoucle) { m_iSeqFrom = m_iFrom ; m_iSeqTo = m_iTo; m_iSeqSpeedPlay = m_iSpeedPlay; m_bSeqBoucle = m_bBoucle; // Le thread ne doit pas être actif assert(!s_hThread); assert(!s_hEvent); // Création de l'event s_hEvent=CreateEvent(NULL, TRUE, FALSE, NULL); // Création du thread DWORD threadId; s_hThread=CreateThread(NULL, 0, ThreadProc, NULL, 0, &threadId); }
Voilà la procédure de thread :
Ca m'a bien ennuyé cette histoire de statique : je voulais directement entrer mon code qui joue la séquence mais comme on ne peut pas rajouter de paramètres à cette fonction, il faut rechercher les m-iFrom, m_iTo, etc; c'est pour ça que j'ai créé les variables m_iSeqFrom, m_iSeqTo qui seront elles accessibles dans ma procédure de thread.
Oui, mais voilà, une fois dans ThreadProc il a pas voulu de mes variables non statiques!!!!
D'où le truc tordu (reinterpret_cast<CMySequence*>(lpParam))->Play(); où dans cette fonction Play je pourrai ENFIN écrire ma fonction tranquille (on verra que non, d'om le post ;-) )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 // Fonction appellée par le thread // DWORD CMySequence::ThreadProc(LPVOID lpParam) { // On boucle tant que l'événement n'est pas signalé while(WaitForSingleObject(s_hEvent, 0)!=WAIT_OBJECT_0) (reinterpret_cast<CMySequence*>(lpParam))->Play(); return 0; }
QUESTION1 : je crois comprendre pourquoi la ligne pour obtenir le pView plante (c'est parce que ThreadProc est statique et donc violation d'accès quand on cherche un pointeur lié au document actif) mais je n'ai pas la solution.
QUESTION2 (pendant que j'y suis) : Avec Invalidate() et UpdateWindow(), je vois bien mes images, mais pas de façon fluide (elles mettent trop de temps à s'afficher avant d'être remplacées par la suivante). J'ai essayé de laisser soit l'un, soit l'autre mais on ne voit rien du coup. Quoi faire?
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 void CMySequence::Play(void) { CMyProjectView *pView=(CMyProjectView *) ((CMainFrame *)AfxGetMainWnd())->GetActiveFrame()->GetActiveView(); //argh, il veut pas !!!!!! CMyImage* pCMyIm; BOOL bContinue=1; while (bContinue) { for(m_iCur=m_iSeqFrom-1; m_iCur<m_iSeqTo; m_iCur++) { BYTE *pimg=(BYTE *)pView->imgOriginal.GetBits(); pCMyIm = GetAtImage(m_iCur); memcpy(pimg - pCMyIm->Width() * (pCMyIm->Height() - 1 ) * pCMyIm->BytesPerPix(), pCMyIm->GetImage(), pCMyIm->Width() * pCMyIm->Height() * pCMyIm->BytesPerPix()); pView->Invalidate(); //pas terrible comme effet pView->UpdateWindow(); //mais l'un ou l'autre seulement ne suffit pas Sleep((DWORD)(1000/m_iSeqSpeedPlay)); } bContinue=m_bSeqBoucle; } }
Partager