LaKiks51
Messages postés13Date d'inscriptionmercredi 16 mai 2007StatutMembreDernière intervention 3 août 2007
-
19 juil. 2007 à 12:45
ctx_man
Messages postés285Date d'inscriptionmardi 28 décembre 2004StatutMembreDernière intervention20 janvier 2013
-
2 août 2007 à 23:50
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?
ctx_man
Messages postés285Date d'inscriptionmardi 28 décembre 2004StatutMembreDernière intervention20 janvier 20133 19 juil. 2007 à 15:09
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.
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 ...
ctx_man
Messages postés285Date d'inscriptionmardi 28 décembre 2004StatutMembreDernière intervention20 janvier 20133 20 juil. 2007 à 17:16
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.
LaKiks51
Messages postés13Date d'inscriptionmercredi 16 mai 2007StatutMembreDernière intervention 3 août 2007 26 juil. 2007 à 14:32
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 :
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).
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 2 août 2007 à 22:40
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é.
ctx_man
Messages postés285Date d'inscriptionmardi 28 décembre 2004StatutMembreDernière intervention20 janvier 20133 2 août 2007 à 23:50
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.