Comment éxécuter des commandes DOS en mode synchrone et asynchrone!!!!

toutoughou Messages postés 42 Date d'inscription jeudi 22 juin 2006 Statut Membre Dernière intervention 23 février 2011 - 9 mars 2009 à 13:39
toutoughou Messages postés 42 Date d'inscription jeudi 22 juin 2006 Statut Membre Dernière intervention 23 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?

Merci

13 réponses

toutoughou Messages postés 42 Date d'inscription jeudi 22 juin 2006 Statut Membre Dernière intervention 23 février 2011
9 mars 2009 à 15:21
J'ai cherché pour longtemps j'ai pas trouvé une bonne solution.
Alors j'ai posé ma question qu'après avoir  cherché partout.

J'ai même testé avec les Threads et ça n'a pas marché.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
9 mars 2009 à 15:24
(Suppression du double post)

Et ? Tu as essayé avec WaitForSingleObject de mon lien ?

Qu'entends-tu exactement par synchrone asynchrone ?
0
toutoughou Messages postés 42 Date d'inscription jeudi 22 juin 2006 Statut Membre Dernière intervention 23 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
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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à.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
toutoughou Messages postés 42 Date d'inscription jeudi 22 juin 2006 Statut Membre Dernière intervention 23 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);
0
toutoughou Messages postés 42 Date d'inscription jeudi 22 juin 2006 Statut Membre Dernière intervention 23 février 2011
9 mars 2009 à 17:09
Ooui notez je me suis basé sur votre exemple c'est pour ca je réponds un peu tard lol
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TTestThread = class(TThread)
  protected
    procedure Execute; override;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
    lpThread: TTestThread;
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TTestThread.Execute;
var
  processInfo: TProcessInformation;
  startupInfo: TStartupInfo;
begin
  ZeroMemory(@startupInfo, SizeOf(TStartupInfo));
  startupInfo.cb:= SizeOf(TStartupInfo);
  startupInfo.dwFlags:= STARTF_USESHOWWINDOW;
  startupInfo.wShowWindow:= SW_SHOW;

  if not CreateProcess(nil, 'c:\test.bat toto',
                       nil, nil, False, 0, nil, nil,
                       startupInfo, processInfo) then RaiseLastOSError;

  WaitForSingleObject(processInfo.hProcess, INFINITE);

  CloseHandle(processInfo.hProcess);
  CloseHandle(processInfo.hThread);

  MessageBox(0, 'Fin de la commande', '', MB_OK);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  lpThread:= TTestThread.Create(True);
  lpThread.FreeOnTerminate:= True;
  lpThread.Resume;
end;

end.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
9 mars 2009 à 17:18
Heu pardon, synchrone bien sûr. Avec ce .bat :
@echo off
echo %1
pause
0
toutoughou Messages postés 42 Date d'inscription jeudi 22 juin 2006 Statut Membre Dernière intervention 23 février 2011
9 mars 2009 à 17:59
OOOPS c'est l'exemple que j'ai testé et qui ne marchait pas
0
toutoughou Messages postés 42 Date d'inscription jeudi 22 juin 2006 Statut Membre Dernière intervention 23 février 2011
9 mars 2009 à 18:02
et voici le message d'erreur que j'ai :
Access violation at address 004233EC in module 'script.exe'. Write of address 0000000E
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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.
0
toutoughou Messages postés 42 Date d'inscription jeudi 22 juin 2006 Statut Membre Dernière intervention 23 février 2011
9 mars 2009 à 19:17
soooory je t'ai embarrassé.
Alors je vais tester tout ca et je vais te répondre avec un message bien détaillé OK?
Merciiiiiiii
0
toutoughou Messages postés 42 Date d'inscription jeudi 22 juin 2006 Statut Membre Dernière intervention 23 février 2011
12 mars 2009 à 10:22
Bonjour;
Voilà on vient d'annuler cette idée.
Merci
0
Rejoignez-nous