Sto scrivendo un programma con VC++ 6.0 e mi stanno succedendo cose strane coi thread.
Il codice semplificato al massimo, quindi tralasciando le cose ovvie, è questo e riguarda la classe della finestra di dialogo, nella quale un pulsante deve avviare o terminare un thread.

codice:
class CMyDlg : public CDialog
{
...
	CWinThread* c;
	int p;
}

...

UINT MyControllingFunction( LPVOID pParam )
{
	CMyDlg *v=(CMyDlg*)pParam;
	while(1)
	{
		if (v->p==0) break;
	}
	return 0;
}

...

CMyDlg::CMyDlg()
{
	p=0;
}

CMyDlg::OnButton1()
{
	if (p==0)
	{
		p=1;
		c=AfxBeginThread(MyControllingFunction,this,0,0, CREATE_SUSPENDED, NULL);
		c->m_bAutoDelete=FALSE;
		c->ResumeThread();
		return;
	}
	
	if(p==1)
	{
		p=0;
		//AfxMessageBox("1");
		WaitForSingleObject(c->m_hThread,INFINITE);
		delete c;
	}
}
Ebbene, cliccando il pulsante il thread viene creato e messo in esecuzione, cliccandolo un'altra volta la funzione WaitForSingleObject si blocca e non si schioda.
Se però tolgo il commento e lascio quell'AfxMessageBox tutto funziona.
Non è un problema di attesa, perché anche se al posto del messagebox ci metto uno Sleep non funziona lo stesso.
Inoltre, nel momento in cui la funzione WaitForSingleObject viene chiamata il thread effettivamente si ferma, ma la funzione non ritorna.
Anche inserendo un AfxEndThread(0) nella funzione del thread non cambia nulla.
Un altro modo per farla funzionare è modificare il codice così:
codice:
class CMyDlg : public CDialog
{
...
	CWinThread* c;
	int p;
}

...

UINT MyControllingFunction( LPVOID pParam )
{
	CMyDlg *v=(CMyDlg*)pParam;
	while(1)
	{
		if (v->p==0) break;
	}
	return 0;
}

...

CMyDlg::CMyDlg()
{
	p=0;
}

CMyDlg::OnButton1()
{
	if (p==0)
	{
		p=1;
		c=AfxBeginThread(MyControllingFunction,this,0,0, 0, NULL);
		return;
	}
	
	if(p==1)
	{
		p=0;
		return;
	}
}
Cioè facendo partire immediatamente il thread e settare quando necessario la variabile p per fermarlo, senza fare altro.
Ma questo mi da dei problemi quando voglio che alla chiusura della finestra di dialogo(metodo OnClose) il thread si interrompa, in quanto non posso beccare il momento esatto in cui l'oggetto CWinThread viene deallocato, e quindi quando posso effettivamente distruggere CMyDlg...