IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Démarrage de threads


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut Démarrage de threads
    Bonjour,

    Dans mon programme principal, j'ai une boucle for qui lance 15 threads.
    J'ai regardé le temps que cela mettait pour lancer ces threads, et j'ai calculé (avec des GetTickCount et des WaitForEvent) que le temps entre le moment ou la première thread est lancée(creathread dans le main) et le temps où la derniere thread lancée arrive à sa première instruction fait 2500ms ...

    Je suis rentré plus en détail et ai remarqué qu'entre le CreateThread(...) dans le main et l'execution de la premiere instruction du thread, il se passait dans les 150 ms (que ce soit pour un programme avec 15 threads ou avec un seul thread).

    Donc pour le lancement de 15 threads, cela me fait 15* 150ms =2500ms (chiffres approximatifs...).

    Comment faire pour optimiser le lancement de 15 threads simultanées ?

    voici un bout de code que je créé spécialement pour illustrer ce problème : Il est un peu fouilli (parce que j'ai pas trouvé plus simple pour mettre en évidence ce problème ) mais pas compliqué .

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include "stdafx.h"
    #include <windows.h>
     
    using namespace std; 
     
    #define nombre_threads  15
     
    HANDLE hEventsThread[15];
    HANDLE hEventsWaitForAllThreadsCreates[15];
     
    static int numero;
     
     
    DWORD WINAPI Thread1(LPVOID lpParameter)
    {
    	numero++;
      WaitForSingleObject(hEventsWaitForAllThreadsCreates[numero],INFINITE); 
    	printf("Ceci est ma thread numero%i\n",numero);
      SetEvent(hEventsThread[numero]); 
    	return 0;
    }
     
     
    int _tmain()
    {
        numero = 0 ;
     
    	for (int i=0 ; i< nombre_threads ; i++) 
    	 { 
    		hEventsThread[i] = CreateEvent( 
    				NULL,   // default security attributes
    				FALSE,  // auto-reset event object
    				FALSE,  // initial state is nonsignaled
    				NULL);
     
    		hEventsWaitForAllThreadsCreates[i] = CreateEvent( 
    				NULL,   // default security attributes
    				FALSE,  // auto-reset event object
    				FALSE,  // initial state is nonsignaled
    				NULL);
    	 }
     
    	DWORD t1 = GetTickCount();
     
    	HANDLE hThread[nombre_threads];
    	unsigned long ThreadId;
     
    	for( i=1;i<=nombre_threads;i++)
    	 {		
    		hThread [i] = CreateThread(NULL,NULL,Thread1,NULL, NULL, &ThreadId);
    	 }
     
    	DWORD t2 = GetTickCount();
    	printf("\n\n %i\n\n",t2-t1);
     
    	for( i=1;i<=nombre_threads;i++)
    	 {		
    		SetEvent(hEventsWaitForAllThreadsCreates[i]); 
    	 }
     
    	WaitForMultipleObjects(	//Attente que tous les SBAs aient bien pris en compte la notif_paquet.
    		nombre_threads,		// number of objects in array
    		hEventsThread,			// array of objects
    		TRUE,					// wait for all
    		INFINITE);				// indefinite wait
     
    	DWORD t3 = GetTickCount();
    	printf("\n\n %i\n\n",t3-t1);
     
    	cin.get();
    	return 0;
    }
    Merci

  2. #2
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut
    Autant pour moi, problème rectifié.

    Le lancement des threads qui prend plus de 2 secondes en mode déboggage prend 100ms lorsque je lance .exe du dossier debug.

    Problème résolu !

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Salut,

    Je te préviens tout de suite, je suis incapable de répondre à ta question, je débute dans les threads .

    Mais voila, je cherche à utiliser des threads pour gérer mes évênements simultanément, et que ces threads récupèrent des données, et les places dans un fichier.

    Donc, j'ai compilé ton prog, mais j'ai un peu de mal. Le message affiché est toujours "Ceci est ma thread numero15" (15 fois).

    Je pense que ceci est du au fait que tu dises d'attendre que tous soient finis, non ?
    Aussi, j'ai fais des tests, et relancant plusieurs fois l'appli, le message change, et affiche par moment "Ceci est ma thread numero10" ou autre.

    Ceci est-il du au temps d'attente ?

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut
    Chez moi, cela fonctionne bien est m'affiche :
    cela est ma thread1
    cela est ma thread2
    cela est ma thread3
    ... jusqu'à 15.

    J'imagine que ton probleme peut venir de la puissance de la machine sur laquelle l'appli tourne...enfin, je sais pas.

    Enfin, bref, j'en ai conclu que c'était le fait d'utiliser les threads en mode debug qui faisait ralentir les executions. Quand je lance l'executable sans le debug, le programme s'execute plus vite ( et meme largement plus vite pour les threads).

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Citation Envoyé par Chop_chop
    Chez moi, cela fonctionne bien est m'affiche :
    cela est ma thread1
    cela est ma thread2
    cela est ma thread3
    ... jusqu'à 15.

    J'imagine que ton probleme peut venir de la puissance de la machine sur laquelle l'appli tourne...enfin, je sais pas.

    Enfin, bref, j'en ai conclu que c'était le fait d'utiliser les threads en mode debug qui faisait ralentir les executions. Quand je lance l'executable sans le debug, le programme s'execute plus vite ( et meme largement plus vite pour les threads).
    Wé, peut-être que je PC que j'utilise peut les gêrer tous en même temps. Je ne sais pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/06/2015, 14h58
  2. [WD18] Le démarrage d'un thread ne se fait pas (aléatoire)
    Par elfasys dans le forum WinDev
    Réponses: 4
    Dernier message: 25/09/2013, 21h16
  3. Ecran de démarrage multi thread qui ne s'affiche pas sur un pc
    Par jacko842 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 16/01/2013, 12h14
  4. Invalid thread access au démarrage d'Eclipse
    Par raz2008 dans le forum Eclipse
    Réponses: 1
    Dernier message: 26/09/2009, 15h56
  5. Thread au démarrage
    Par Hurin dans le forum C#
    Réponses: 22
    Dernier message: 26/08/2007, 06h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo