[Visual C++] AfxEndThread(); hors de la fonction lancée par AgxBeginTh

AfxEndThread(); hors de la fonction lancée par AgxBeginTh [Visual C++] - Programmation

Marsh Posté le 04-09-2001 à 10:11:59    

Je n'arrive pas faire fonctionner (ça compile mais ça plante) la fonction AfxEndThread HORS de la fonction lancée par AfxBeginThread();
Voici mon code :
 
CWinThread *th;
DWORD ec;
 
UINT scanIp(void* pDialog)
{
 //Longue boucle while(true){}
 return 1;
}
 
void CScanDlg::OnStart()  
{
 th = AfxBeginThread(scanIp,this);
}
 
void CScanDlg::OnStop()  
{
 GetExitCodeThread(th->m_hThread,&ec);  
 AfxEndThread(ec); //CA PLANTE !
}
 
Je tiens absolument à utiliser AfxEndThread(); et non faire un while(t == false) et mettre t = true; pour stopper le thread ! (ma boucle est trop

Reply

Marsh Posté le 04-09-2001 à 10:11:59   

Reply

Marsh Posté le 04-09-2001 à 14:06:45    

Ta boucle est trop quoi ?
 
C'est pourtant comme cela qu'il faut faire, avec confirmation si ta boucle est longue...
 
D'une maniere generales les methodes qui arretent brutalement une Thread a partir d'une autre sont a desconseiller...

Reply

Marsh Posté le 04-09-2001 à 14:31:39    

trop longue.
Je peux pas faire le test quand je quitte mon applicaion car la boucle n'étant pas finie, ça plante (la fonction connect() prend beaucoup de temps).

Reply

Marsh Posté le 05-09-2001 à 09:03:24    

Fais un test avec confirmation...
 
CWinThread *th;  
DWORD ec;
bool StopThreadRequired;
bool ThreadStopped;
 
 
UINT scanIp(void* pDialog)  
{
StopThreadRequired =  ThreadStopped = false
//Longue boucle while(!StopThreadRequired ){}
ThreadStopped = true  
return 1;  
}  
 
void CScanDlg: nStart()  
{  
th = AfxBeginThread(scanIp,this);  
}  
 
void CScanDlg: nStop()  
{  
GetExitCodeThread(th->m_hThread,&ec);
StopThreadRequired = true;
while(ThreadStopped)
{
  Sleep(100);
}
//AfxEndThread(ec); //CA PLANTE !  
}  
 
Sinon, en POSIX il y a moyen de faire des points de sychronisation, c'est en fait l'ideal dans ton cas, le AfxEndThread() est un point de synchro avec la fin de la methode IpScan()...

Reply

Marsh Posté le 05-09-2001 à 13:45:29    

Le problème de ce test, c que la boucle while() prend trop de temps et que lorsque que je quitte brutalement l'appli, je met le bool = false met la boucle n'étant pas en phase de test (la boucle est longue), ç a plante !!!

Reply

Marsh Posté le 05-09-2001 à 15:14:36    

Je ne comprend pas ton probleme...
1- Terminer une Thread depuis une autre ne doit jamais etre fait.
2- modifier la valeur d'un bool ne fait pas planter
3- tu n'es pas oblige d'utiliser une boucle while, tu peut retester la valeur en plusieurs endroits pour diminuer le temps de reponse.
4- As-tu vraimenet essayer avec ce systeme de confirmation...
5- Que fait tu de si long ? moi je fait des Executions de Procedure stockes... et ca marche nikel...

Reply

Marsh Posté le 05-09-2001 à 17:53:22    

Quand je ferme ma dialogue (la croix), est-ce que tous les thread sont suspendus ?
Car j'ai mis ce bout de code  
 
void CScanDlg::OnClose()  
{
 halt = 1;
 while(qok == 0)
  Sleep(10);
 
 CDialog::OnClose();
}
 
halt = 1 doit arrêter le thread.
qok = 1 quand on arrive à la fin du thread (une fois que halt = 1).
Seulement quand je ferme, qok n'est jamais == 1 ce qui me laisse sous entendre que les threads sont suspendus à la fermeture.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed