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