Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2498 connectés 

 


Dernière réponse
Sujet : [Visual C++] AfxEndThread(); hors de la fonction lancée par AgxBeginTh
antsite 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.

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
antsite 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.
BENB 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...
antsite 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 !!!
BENB 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()...
antsite 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).
BENB 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...
antsite 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

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)