.exe simultanés

Signaler
Messages postés
13
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
3 août 2007
-
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013
-
Bonjour,

j'aimerais exécuter plusieurs .exe simultanément. Le truc c'est que je ne sais
pas combien c'est à dire que j'aimerais que mon programme exécute un nombre
aléatoire de .exe (un nombre pouvant être assez élevé). Je pensais utiliser
"system (command)" pour l'exécution simultané. J'aurais voulu construire
la variable "command" en fonction des exécutable à exécuter et de
leur nombre.

Ma question est : comment puis-je construire la variable "command"
(qui contiendra le nom de l'exécutable + ses paramètres) sachant que je ne sais
pas combien d'exe sont à concaténer?

J'espère avoir été clair.

Merci de votre aide









ps: je travaille sous Visual C++

8 réponses

Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

Salut !

Sous dos (ligne de commande microsoft) le séparateur de commande c'est '&'.

Si tu tape "notepad & notepad & notepad", ca lancera 3 notepad

C'est une chaine de caractères, alors pour construire la ligne de commande, il te suffit d'utiliser les fonctions classiques (strcat, strlen, ......)

Pour les paramètres le shell décompose la chaine de la mannière suivante :

NomDuProgramme UnParametre UnSecondParametre "un parametre avec des espaces" "UnParametreSansEspaces"
conclusion, si tu veux passer des argument à un programme, fait le entre " " pour chaque argument.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Salut,

Tu peux aussi boucler avec un for sur un CreateProcess qui lance une instance à chaque boucle.
Messages postés
3
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
20 juillet 2007

Pour chaque executable + paramètres tu peux ajouter à une chaîne szExecs cette commande dans une boucle :

char szTemp [1024] ;
strcpy (szTemp, szExecs) ;
wsprintf (szExecs, "%s & "%s" %s", szTemp, szNom_de_lexecutable, szParametres) ;

Le souci c'est que wsprintf limite l'édition de chaîne à 1024 caractères et dans ton cas c'est trop peu . Il doit exister un équivalent mais en temps que noob là-dessus je ne peuxpas trop t'aider ...
Messages postés
3
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
20 juillet 2007

Les entrées à la ligne ont disparues ...

Re-voici le bout de code en plus clair :

char szTemp [1024] ;
strcpy (szTemp, szExecs) ;
wsprintf (szExecs, "%s & "%s" %s", szTemp, szNom_de_lexecutable, szParametres) ;
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

Salut, désolé mais ca marchera pas ton code.

strcpy ne fait pas une concaténation des chaines mais un clonage de la première dans la seconde.
Après cette fonction szTemp et szExecs contiennent la même chose.
wsprintf suppose de travailler avec des chaines en unicode or la fonction system ne travail pas en unicode.
S'il veux travailler en unicode, il devra utiliser _wsystem à la place de system.
De plus, les fonctions de formattages comme printf/sprintf/... sont très lourdes et gourmande pour faire juste de la concaténation de chaine.

Dernière précision, wsprintf est une fonction pour Window CE normalement, c'est peut-être pour ca qu'ils ont définit une taille maximale si faible.
la fonction equivalente c'est _swprintf.
Messages postés
13
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
3 août 2007

Je vous remercie pour vos réponses, cela m'a bien aidé,
notamment à m’apercevoir que ce n’est pas du tout ce que je voulais faire...


Il
faudrait que j’utilise les threads pour gérer des exécutions simultanées, il
est évident (maintenant) que le nombre d’executions simultanées sera plus
important à l’aide des threads. C’est donc ce que j’ai fait et bien entendu j’ai
rencontré un problème que voici :


J’ai réussi à programmer quelque chose sous Windows et j’obtiens
un nombre de threads de 2000 environs c'est-à-dire que j’en crée un maximum
jusqu’au limite de la machine et ce nombre limite est apparemment 2000.


J’ai ensuite effectué la même opération sous linux et je ne
dépasse pas les 200. Je trouve cela très bizarre et je me demande si cela ne
viens pas de mon code sous linux :


Je déclare comme ceci



pthread_t handle[1024] ; //Je voudrais créer 1024 threads



Ensuite les créations des threads :



While (i != cpt) //cpt contient le nombre de threads que je souhaite créer
{
           i

f ( pthreat_create(&handle[i],
NULL, " Nom du thread ", NULL)<0)

           {

                        printf(“begin thread
error”);

                        return error

           }

           i++;

}












Il y aurait-il quelque chose qui ne va pas dans ce code
"simplifié" qui ferait que je ne peux pas créer autant de threads que sous windows.


Il faut savoir que les ressources de la machine linux (Mandriva, récente version)  sont équivalentes voir supérieures à
la machine Windows (Windows XP SP2).



Merci encore de votre aide
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
lol.
Si tu croises un linuxien dans un couloir, rase le murt !

2000 threads sous Windows, c'est peut être beaucoup, mais c'est pas idéal. Un processeur ne peut executer qu'un thread à la fois (Ou un peu plus s'il est dual core gère l'hyperthreading ou que sais je encore. Mais ça dépasseras certainement pas les 16 threads sur un PC du commerce.)

Changer de thread, ça signifie changer de contexte pour le processeur. C'est une opération lente, même si elle est plus rapide qu'un changement de processus. Donc utiliser trops de thread à tendance à "tuer" les performances d'un PC.

Pour le coup de Linux/Windows, je sais que l'ordonnaceur de Windows travail au niveau thread, mais j'ai entendu dire que celui de Linux travaillait au niveau des processus (A vérifier...) Cela expliquerait un peu la différence (Les 200 threads se partageant les quelques % de CPU alloué au processus. Y a peut être moyen d'arranger le coup dans des options du système)

Les linuxiens se carressent devant la fonction fork(), qui fait une duplication du processus courant. Je n'ai jamais compris l'intérêt de cette fonction (J'ai eu l'occasion de m'en servir pourtant). Mais tu devrais l'essayer : tes perfs devraient être meilleurs vu sa popularité.
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

L'interet de la fonction fork c'est que en plein milieu d'une fonction tu fait un fork() et vlam, t'est dans un autre processus. Pas besoins de fonction callback ou je ne sais quoi d'autre. Super pratique pour coder des serveurs notemment. Par contre ca obliger à réflechir un minimum, parce que du coup, il n'y a aucune séparation entre le code du processus père et celui du fils.