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;
	}
}