Comment éxécuter des commandes DOS en mode synchrone et asynchrone!!!!
toutoughou
Messages postés42Date d'inscriptionjeudi 22 juin 2006StatutMembreDernière intervention23 février 2011
-
9 mars 2009 à 13:39
toutoughou
Messages postés42Date d'inscriptionjeudi 22 juin 2006StatutMembreDernière intervention23 février 2011
-
12 mars 2009 à 10:22
Bonjour;
je veux exécuter une commande .cmd
c-à-d un fichier avec extension .cmd : "script.cmd" qu'il faut lancer .
j'ai testé avec shellExecute et ca marche mais je veux aussi les
exécuter dans les deux modes : synchrone et asynchrone.Comment ce faire?
Est ce que je peux passer par les processus(THREADS) ou bien il y a une façon plus simple à suivre?
toutoughou
Messages postés42Date d'inscriptionjeudi 22 juin 2006StatutMembreDernière intervention23 février 2011 9 mars 2009 à 16:35
En fait je veux lancer un ensemble de commande à partir du serveur sur des postes clients via mon programme donc je veux qu'elles soient gérées dans les deux cas de serveur : synchrone et asynchrone.
J'espère que c'est bien compris
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 9 mars 2009 à 16:41
Par défaut, CreateProcess n'attend pas la fin du processus créé pour continuer le code de l'appelant -> Asynchrone.
On peut utiliser WaitForSingleObject pour attendre la fin d'un processus -> Synchrone.
C'est le gel de l'appli dans le cas d'un WaitForSingleObject qui te gène ou tu n'en es pas encore là.
Vous n’avez pas trouvé la réponse que vous recherchez ?
toutoughou
Messages postés42Date d'inscriptionjeudi 22 juin 2006StatutMembreDernière intervention23 février 2011 9 mars 2009 à 17:09
Donc si je mets ce code ca sera juste??
shell:= ShellExecute(0,'open','script.cmd',Nil,Nil,SW_HIDE);
if not mode ='a' then //mode Asynchrone
CreateProcess(nil,Pchar(shell),nil, nil, False, 0, nil, nil,startupInfo, processInfo)
else // mode synchrone
WaitForSingleObject(shell,SYNCHRONIZE);
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 9 mars 2009 à 17:16
Argh !
CreateProcess a un peu le même fonctionnement que ShellExecute. Il est préférable que tu utilises CreateProcess plutôt que ShellExecute. Consulte la documentation avant d'utiliser une fonction. Doc de CreateProcess.Doc de WaitForSingleProcess.
Voici un exemple de lancement asynchrone avec thread :
unit Unit1;
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 9 mars 2009 à 18:13
Toutoughou, c'est pas que, mais j'ai du mal à comprendre ce que tu me raconte.
Essaie d'être plus explicite, de plus expliquer ce qui se passe, de faire des messages plus long, et n'hésite pas à te répéter en reformulant.
"OOOPS c'est l'exemple que j'ai testé et qui ne marchait pas"
Tu parles ici du dernier post que j'ai donné ?
Ca peut pas être un exemple que tu avais déjà testé : je viens de l'écrire ! Alors oui, tu en a peut être vu un qui y ressemble beaucoup. Il n'empèche, le mien, c'est pas le même.
Concernant ton message d'erreur, démarre ton appli en mode débug (F9 dans Delphi) et met un point d'arrêt n'importe où. Peu importe c'est juste pour qu'elle soit en train de tourner.
Là, tu va dans le menu "Chercher", puis "Erreur d'exécution..." (Il faut que l'appli tourne pour que cette option soit activée). Et comme adresse, tu tapes : $004233EC, celle indiquée dans le message d'erreur. Tu devrais ainsi déterminé la ligne de code qui a amené ton appli à planter.