Démarrage automatisé des applications

InAir

PILOTE PRO
Messages
1 066
Réactions
132
Bonjour ,
En parcourant le forum je lit que l'ordre de démarrage des applications doit être organisé.
Il y a pas mal d’applications à démarrer dans nos simulateurs. Je me suis donc dit que je devrai faire une application qui démarre tout sans devoir mettre la main sur un clavier ou une souris. Dison un code qui exécute des commandes et qui ne vit que le temps du démarrage des applications. Les applications doivent démarrer dans un ordre précis. Cet ordre sera donné par un chef d’orchestre. Le chef recevra l’ordre de démarrer l’application suivante uniquemenl a reçu le feux vert de la dernière application démarrée.
Pour ma part, j’ai 4 Pc clients et un Pc serveur.

Imp Pc.JPG

Pour commencer ,j'ai déjà établit une stratégie comme suit :
StartUp Server sur le Pc Seveur.
StartUp Client sur chaque Pc client. StartUp Client est identique sur chaque Pc.
Un raccourcit dans le dossier de démarrage Win10 sur chaque Pc pour starter automatiquement StartUp Server et StartUp Client.
Mise sous tension : Power On général.
  • Les 5 Pc démarrent
L’application StartUp Server démarre sur le Pc Serveur.
L’application StartUp Client démarre sur chaque client (4).
Le serveur démarre le serveur IOCP sur le serveur.
Le serveur ouvre le port de communication sur le serveur IOCP.
Le serveur ouvre le port de communication pour les 4 clients.
Les 4 clients établissent la connexion avec StartUp Server.
  • Chaque client envoi le nom de son HDD quand la connexion est établie.
StartUp Server identifie chaque client lors de la connexion avec le nom du disque de chaque client.
StartUp Server attend que les 4 clients soit connectés.
Quand StartUp Server a reçu les messages de connexion des 4 clients, il envoi le premier ordre de démarrage d’une application sur un clients précis.
  • Le client décompose le message envoyé par StartUp Server.
  • Le client démarre l’application.
  • Le client vérifie si l’application tourne.
  • Le client envoi à StartUp Server le message que le démarrage de l’application est réussi et quelle est en fonctionnement.
StartUp Server acquitte l’information et fait une nouvelle demande à un client.
Et ainsi de suite jusqu’à ce toutes les applications soit lancées.
Quand toutes les applications sont démarrées, StartUp Server donne l’ordre aux clients de se déconnecter.
Les clients coupent la connexion avec StartUp Server.
Chaque client ferme son application StartUp Client. StartUp Client ne tourne plus sur le client.
StartUp Server ferme le port de communication vers les clients. StartUp Server se ferme à son tour.
Note :
StartUp Server peut bien entendu lui-même starter une application présente sur le serveur.
Le port utilisé par StartUp Server est différent du port utilisé pour IOCP, ce qui permet de ne pas filtrer les messages reçus sur le serveur par le démarrage des différents applications SIOC sur les clients .Une application Sioc qui démarre ,envoi toujours le message « Arn.Vivo » (Protocol de com IOCP).

Voilou.

JeanMi
 
Code:
interface // InAir Client App
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs , ComCtrls, ExtCtrls, StdCtrls, ScktComp ,ShellApi ,Sockets ,TLHelp32;
CONST PortServeur = 8080;
      IPHost = '169.254.80.245';
type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
              ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientSocket1Connect(Sender: TObject;
              Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject;
              Socket: TCustomWinSocket);
  private
  public
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}

function StartApp(App : String) : Boolean;
var SEInfo: TShellExecuteInfo;
    ExitCode: DWORD;
    ExecuteFile, ParamString, StartInString: string;
begin
  ExecuteFile:= App;
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);
  with SEInfo do
     begin
       fMask := SEE_MASK_NOCLOSEPROCESS;
       Wnd := Application.Handle;
       lpFile := PChar(ExecuteFile);
     end;
  if Not ShellExecuteEx(@SEInfo) then
     Result := False
     else
       Result := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.Hide;
  ClientSocket1.Port:= PortServeur;
  ClientSocket1.Host := IPHost;
  Sleep(20000);
  ClientSocket1.Open;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;Socket: TCustomWinSocket);
Var VolName     : Array[0..Max_Path]Of Char;
    FileSysName : Array[0..Max_Path]Of Char;
    VolSerial   : DWord;
    FileMaxLen  : DWord;
    FileFlags   : DWord;
begin
  GetVolumeInformation
     ('C:\',VolName,Max_Path,@VolSerial,FileMaxLen, FileFlags,FileSysName,Max_Path);
  ClientSocket1.Socket.SendText(VolName +' Connecté');
end;           

procedure TForm1.ClientSocket1Error(Sender: TObject;Socket: TCustomWinSocket;
                 ErrorEvent: TErrorEvent;var ErrorCode: Integer);
begin
  ClientSocket1.Close;
  Application.Terminate;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;Socket: TCustomWinSocket);
Var ReceiveTxt ,IdMachine ,SchApplix ,Applix : String;
begin
  ReceiveTxt := ClientSocket1.Socket.ReceiveText;
  IdMachine := ReceiveTxt;
  SchApplix := ReceiveTxt;
  Applix := ReceiveTxt;
  Delete(IdMachine,Pos('\',IdMachine),64);
  Delete(SchApplix,1,Pos('\',SchApplix));
  Delete(Applix,1,Pos('\',Applix));
  Delete(Applix,1,Pos('\',Applix));
  Delete(Applix,1,Pos('\',Applix));
  Delete(Applix,Pos('.',Applix),4);
  If StartApp(SchApplix) then
     ClientSocket1.Socket.SendText(Applix + ' Running On ' + IdMachine)
     else
       ClientSocket1.Socket.SendText(Applix + ' Not Running On ' + IdMachine)
end;

end.
Bonsoir ,
J'ai écrit le code pour les clients.
 
Bonsoir ,
Update du code client => modification 'function StartApp' pour pouvoir fermer les applications en douceur et à distance en fin de séance.
Prochaine étape :
1 - utiliser un tableau dynamique (dimention variable en fonction du nombre de 'EXE' à lancer).
2 - Lier un fichier 'txt' avec la liste des applications à lancer.A la lecture du fichier ,on remplit le tableau dynamique.On pourrais aussi y inclure le nombre de Pc ,les ports à utiliser et l'ip du serveur.

Le code serveur : J'ai choisi un socket (un port) par Pc pour faciliter la gestion des éventuelles erreurs de connexion.

Code:
Var i ,x ,y ,T : Byte;
    MipCoConnected ,MipFoConnected ,PfdNdCoConnected ,
    PfdNdFoConnected : Boolean;
    ListAppli : array[0..2,0..Max] of string;
procedure TForm1.FormCreate(Sender: TObject);
var j : Byte;
begin
  Form1.Show;
  i := 0;
  x := 0;
  y := 0;
  T := 10;
  MipCoConnected := False;
  MipFoConnected := False;
  PfdNdCoConnected := False;
  PfdNdFoConnected := False;
  ListAppli[0,0] := 'MipCo'; ListAppli[1,0]  := 'C:\Sioc\Sioc.exe';
  ListAppli[0,1] := 'MipFo'; ListAppli[1,1]  := 'C:\Sioc\Sioc.exe';
  ListAppli[0,2] := 'PfdNdCo'; ListAppli[1,2]  := 'C:\Sioc\Sioc.exe';
  ListAppli[0,3] := 'PfdNdFo'; ListAppli[1,3]  := 'C:\Sioc\Sioc.exe';
  ListAppli[0,4] := 'MipCo'; ListAppli[1,4]  := 'C:\ProsimAudio\ProsimAudio.exe';
  ListAppli[0,5] := 'MipFo'; ListAppli[1,5]  := 'C:\ProsimAudio\ProsimAudio.exe';
  ListAppli[0,6] := 'PfdNdCo'; ListAppli[1,6]  := 'C:\ProsimAudio\ProsimAudio.exe';
  ListAppli[0,7] := 'PfdNdFo'; ListAppli[1,7]  := 'C:\ProsimAudio\ProsimAudio.exe';
  ListAppli[0,8] := 'MipCo'; ListAppli[1,8]  := 'C:\ProsimDisplay\ProsimDisplay.exe';
  ListAppli[0,9] := 'MipFo'; ListAppli[1,9]  := 'C:\ProsimDisplay\ProsimDisplay.exe';
  ListAppli[0,10] := 'PfdNdCo'; ListAppli[1,10] := 'C:\ProsimDisplay\ProsimDisplay.exe';
  ListAppli[0,11] := 'PfdNdFo'; ListAppli[1,11] := 'C:\ProsimDisplay\ProsimDisplay.exe';
  for j := 0 to Max do
      ListAppli[2,j] := 'NoRun';
  Application.ProcessMessages;
  ServerSocket1.Port:= PortClientMipCo;ServerSocket1.Open;
  ServerSocket2.Port:= PortClientMipFo;ServerSocket2.Open;
  ServerSocket3.Port:= PortClientPfdNdCo;ServerSocket3.Open;
  ServerSocket4.Port:= PortClientPfdNdFo; ServerSocket4.Open;
  Label1.Caption := 'Démarrage Serveur';
end;

Procedure TForm1.ApplixRunning(Msg :String);
begin
  Msg := Copy(Msg,Pos(' ',Msg) + 1 ,3); //Run ou Not
  if Msg = 'Run' then
     begin
       ListAppli[2,y] := 'Run';
       if y = 11 then
          begin
            Label1.Caption := 'Toutes les applications sont lancées';
            StopProcess.Caption := 'Application auto Stop dans 10 Secondes';
            Timer2.Enabled := true;
          end
          else
            begin
              Inc(y);
              Timer1.Enabled := true;
            end;
     end;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Dec(T);
  If T = 0 then
     Application.Terminate;
  StopProcess.Caption :=
     'Application auto Stop dans ' + inttostr(T) + ' Secondes';
end;

Procedure TForm1.AllConnected();
begin
  Inc(i);
  if i = 4 then
     begin
       Label1.Caption := 'Lancement des applications';
       Timer1.Enabled := true;
     end;
end;

procedure TForm1.ServerSocket1ClientRead
         (Sender: TObject;Socket: TCustomWinSocket);
var ReceiveText : String;
begin  //MipCo 8080
  ReceiveText :=  Socket.ReceiveText;
  if Copy (ReceiveText,1,3) = 'Arn' then Exit ;
  ListBox1.Items.Add(ReceiveText);
  ApplixRunning(ReceiveText);
end;

procedure TForm1.ServerSocket2ClientRead
         (Sender: TObject;Socket: TCustomWinSocket);
var ReceiveText : String;
begin  //MipFo 8081
  ReceiveText :=  Socket.ReceiveText;
  if Copy (ReceiveText,1,3) = 'Arn' then Exit ;
  ListBox1.Items.Add(ReceiveText);
  ApplixRunning(ReceiveText);
end;

procedure TForm1.ServerSocket3ClientRead
         (Sender: TObject;Socket: TCustomWinSocket);
var ReceiveText : String;
begin //PfdNdCo 8082
  ReceiveText :=  Socket.ReceiveText;
  if Copy (ReceiveText,1,3) = 'Arn' then Exit ;
  ListBox1.Items.Add(ReceiveText);
  ApplixRunning(ReceiveText);
end;

procedure TForm1.ServerSocket4ClientRead
         (Sender: TObject;Socket: TCustomWinSocket);
var ReceiveText : String;
begin //PfdNdFo 8083
  ReceiveText :=  Socket.ReceiveText;
  if Copy (ReceiveText,1,3) = 'Arn' then Exit ;
  ListBox1.Items.Add(ReceiveText);
  ApplixRunning(ReceiveText);
end;
procedure TForm1.ServerSocket1ClientConnect
         (Sender: TObject;Socket: TCustomWinSocket);
begin
  ListBox1.Items.Add('MipCo Connecté');
  MipCoConnected := true;
  AllConnected();
end;
procedure TForm1.ServerSocket2ClientConnect
         (Sender: TObject;Socket: TCustomWinSocket);
begin
  ListBox1.Items.Add('MipFo Connecté');
  MipFoConnected := true;
  AllConnected();
end;
procedure TForm1.ServerSocket3ClientConnect
         (Sender: TObject;Socket: TCustomWinSocket);
begin
  ListBox1.Items.Add('PfdNdCo Connecté');
  PfdNdCoConnected := true;
  AllConnected();
end;
procedure TForm1.ServerSocket4ClientConnect
         (Sender: TObject;Socket: TCustomWinSocket);
begin
  ListBox1.Items.Add('PfdNdFo Connecté');
  PfdNdFoConnected := true;
  AllConnected();
end;

procedure TForm1.ServerSocket1ClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  Timer1.Enabled := False;
  MipCoConnected := False;
  ListBox1.Items.Add('MipCo déconnecté' );
  Label1.Font.Color := ClRed;
  Label1.Caption := 'Procedure stoppée';
  ErrorCode := 0;
  StopProcess.Caption := 'Exit';
end;

procedure TForm1.ServerSocket2ClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  Timer1.Enabled := False;
  MipFoConnected := False;
  ListBox1.Items.Add('MipFo déconnecté' );
  Label1.Font.Color := ClRed;
  Label1.Caption := 'Procedure stoppée';
  ErrorCode := 0;
  StopProcess.Caption := 'Exit';
end;

procedure TForm1.ServerSocket3ClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  Timer1.Enabled := False;
  PfdNdCoConnected := False;
  ListBox1.Items.Add('PfdNdCo déconnecté' );
  Label1.Font.Color := ClRed;
  Label1.Caption := 'Procedure stoppée';
  ErrorCode := 0;
  StopProcess.Caption := 'Exit';
end;

procedure TForm1.ServerSocket4ClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  Timer1.Enabled := False;
  PfdNdFoConnected := False;
  ListBox1.Items.Add('PfdNdFo déconnecté' );
  Label1.Font.Color := ClRed;
  Label1.Caption := 'Procedure stoppée';
  ErrorCode := 0;
  StopProcess.Caption := 'Exit';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  if (ListAppli[0,y] = 'MipCo') And (MipCoConnected) then
     ServerSocket1.Socket.Connections[0].
     SendText(ListAppli[0,y] + '\' + ListAppli[1,y]);
  if (ListAppli[0,y] = 'MipFo') And (MipFoConnected) then
     ServerSocket2.Socket.Connections[0].
     SendText(ListAppli[0,y] + '\' + ListAppli[1,y]);
  if (ListAppli[0,y] = 'PfdNdCo') And (PfdNdCoConnected) then
     ServerSocket3.Socket.Connections[0].
     SendText(ListAppli[0,y] + '\' + ListAppli[1,y]);
  if (ListAppli[0,y] = 'PfdNdFo') And (PfdNdFoConnected) then
     ServerSocket4.Socket.Connections[0].
     SendText(ListAppli[0,y] + '\' + ListAppli[1,y]);
  Label1.Caption := 'Send ' + ListAppli[0,y] + ' ' + ListAppli[1,y];
  Application.ProcessMessages;
end;

procedure TForm1.StopProcessClick(Sender: TObject);
begin
  if StopProcess.Caption = 'Exit' then
     begin
       ServerSocket1.Close;
       ServerSocket1.Close;
       ServerSocket1.Close;
       ServerSocket1.Close;
       Application.Terminate;
     end;
  Timer1.Enabled := False;
  StopProcess.Caption := 'Exit';
  Label1.Font.Color := ClRed;
  Label1.Caption := 'Procedure stoppée';
end;
end.
 
Dernière édition:
Le panel de l'application ,ici le process s'est bien passé.
Appli lancées.gif
 
Dernière édition:
Une gestion d'erreur (j'ai oter la RJ45 sur un des Pc pendant le cycle) :
Err connection.gif
 
Dernière édition:
J'ai essayé d'updater le code du client ,mais l'option edit n'est pas presente.
Je met le nouveau code client ici.
Code:
Type  tagPROCESSENTRY32 = packed record
         dwSize: DWORD;
         cntUsage: DWORD;
         th32ProcessID: DWORD;
         th32DefaultHeapID: DWORD;
         th32ModuleID: DWORD;
         cntThreads: DWORD;
         th32ParentProcessID: DWORD;
         pcPriClassBase: Longint;
         dwFlags: DWORD;
         szExeFile: array[0..MAX_PATH - 1] of Char;
       end;
function ApplicRunning(NomApplication : string; StopProcess:Boolean):Boolean;
var
  ProcListExec : TProcessentry32;
  PrhListExec : Thandle;
  Continu : Boolean;
  isStarted : Boolean;
  HandleProcessCourant : Cardinal;
  PathProcessCourant : string;
  ProcessCourant :String;
begin
  ProcListExec.dwSize:=sizeof(ProcListExec);
  Continu := True;
  isStarted := False;
Try
  PrhListExec:=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
  if (PrhListExec <> INVALID_HANDLE_VALUE) then
     begin
       Process32First(PrhListExec,ProcListExec);
       while Continu do
         begin
           ProcessCourant := Uppercase(ExtractFileName(ProcListExec.szExeFile));
           ProcessCourant := ChangeFileExt(ProcessCourant,'');
           isStarted := (ProcessCourant = Uppercase(NomApplication));
           if isStarted then
             begin
               HandleProcessCourant := ProcListExec.th32ProcessID;
               PathProcessCourant := ExtractFilepath(ProcListExec.szExeFile);
               Continu := False;
             end
             else
               Continu := Process32Next(PrhListExec,ProcListExec);
         end;
     if StopProcess then
        if isStarted then
           begin
             TerminateProcess
                 (OpenProcess(PROCESS_TERMINATE,False,HandleProcessCourant),0);
             Sleep(500);
           end;
     end;
Finally
  CloseHandle(PrhListExec);
  Result := isStarted;
End;
end;

Function DemarrageAppli(CheminAppli ,NomAppli : String) : Boolean;
Var CountStartup : Byte;
begin
  CountStartup := 0;
  ShellExecute(0,Nil,PChar(CheminAppli),nil,nil,Sw_ShowNormal);
  REPEAT
    begin
      Application.ProcessMessages ;
      Inc(CountStartup);
      if CountStartup = 100 then
         begin
           Application.ProcessMessages ;
           Result := False;
           Break;
         end;
    end;
  UNTIL
     ApplicRunning(NomAppli,false) = true;
  Result := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.Hide;
  ClientSocket1.Port:= PortServeur;
  ClientSocket1.Host := IPHost;
  Sleep(20000);
  ClientSocket1.Open;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;Socket: TCustomWinSocket;
                 ErrorEvent: TErrorEvent;var ErrorCode: Integer);
begin
  ClientSocket1.Close;
  Application.Terminate;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;Socket: TCustomWinSocket);
Var IdMachine ,SchApplix ,Applix ,ReceiveText : String;
begin
  ReceiveText := ClientSocket1.Socket.ReceiveText;
  IdMachine := ReceiveText;
  SchApplix := ReceiveText;
  Applix := ReceiveText;
  Delete(IdMachine,Pos('\',IdMachine),64);
  Delete(SchApplix,1,Pos('\',SchApplix));
  Delete(Applix,1,Pos('\',Applix));
  Delete(Applix,1,Pos('\',Applix));
  Delete(Applix,1,Pos('\',Applix));
  Delete(Applix,Pos('.',Applix),4);Lowercase(Applix);
  If ApplicRunning(Applix, False) = False then //Application ne tourne pas
     if DemarrageAppli(SchApplix ,Applix) then //Démarrage Application réusie
        ClientSocket1.Socket.SendText(Applix + ' Running On ' + IdMachine)
        else
          ClientSocket1.Socket.SendText(Applix + ' NotRunning On ' + IdMachine);
end;
end.
 
Je dis peut etre une betise mais sur SimAvionics, apres avoir mis mes ordis sous tension, j'ai un seul click à faire sur une icone "SimA Launcher" et toutes les appli ( MCP CDU1 CDU2 PFD1 PFD2 ND1 ND2 MFD SOUND 1&2 etc, etc, se lancent en séquence toutes seules, et l'avion se met en cold and dark.
Durée totale du processus 30 sec
Pour tout eteindre , suivi de la check list jusqu'au switch Battery OFF qui fait retour au Cold and dark, le visuel (P3D) reste allumé. Un autre click et tout s'eteint y compris les PC.
Heureusement d'ailleurs car je serais bien incapable de naviguer dans ton programme ;G)
 
Salut Jack ,
Je pense qu'on n'a pas ce type de soft.
Faire un "Laucher" perso ,me permet de démarrer n'importe quoi dans un ordre précis.
Avec un Launcher donné ,on ne peut peut être pas ajouter des applications.
Je ne sais pas.
Bat
Jean Mi
 
Bonjour à tous,
j'ai eu quelques soucis avec les affichages sur les écrans du mip. Je suis en bureau étendu entre le PfdNd et le clock.
En fait ,il faut attendre que Prosim system ai fait son premier tour de cycle avant de lancer Prosim display sans quoi ,l'affichage ne se place pas exactement la ou je l'ai décidé.
Au démarrage ,je lance tous les serveurs Sioc (renseigné comme tel dans le fichier config de prosim system).
Ensuite ,je lance prosim system puis prosim display sur les clients.
Comment être sur que prosim système est déjà démarrer et a déjà fait son premier tour de cycle avant de lancer prosim display.
- Ajouter une variable Vx dans un fichier SSI non lièe.
- Mettre cette variable à 1 par défaut.
- Lier cette variable avec une sortie users dans prosim.
Quand prosim aura fait son premier tour de boucle ,la variable Vx changera d'état et passera à zéro.
Pour pouvoir lire l'état d'une variable IOCP sur un socket TcpIP depuis une application externe :
- Initier la lecture de la variable => une fois initiée ,on recevra sont état à chaque changement de sa valeur sur le socket TcpIp.
Il suffit alors de traiter la valeur de Vx avant de poursuivre le démarrage des applications qui ont besoin de prosim syteme.

Code:
Code pour initier la lecture d'une variable ici la 1. A envoyer sur le socket :

A n'envoyer qu'une seul fois.(une boucle For Next peut facilement en 4 lignes initier la totalité des variables IOCP). 

('Arn.Inicio:1'+ ':' + chr($0D) + chr($0A));



Code de réception sur le socket (un seul code ,le message est décomposé pour chaque variables qui change d'état) :

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
Var J ,K ,L : Byte;
    NumVar ,ValVar ,X : integer;
    A : String;
begin
  A := Socket.ReceiveText;       //Format reçu "Arn.Vivo:Arn.Resp:NumVar=ValVar:"
  J := Pos('=',A);
  K := Length(A) - 3;   //Dernier caractère de la valeur de la variable
  L := Pos('p',A) + 2;  //Premier caractère du Numéro de la variable
  Val(Copy(A,L,J - L),NumVar,X);  // numéro (numérique) de la variable Sioc
  Val(Copy(A,J + 1,K - J),ValVar,X); // valeur (numérique) de la variable Sioc
 // appeler une fonction ICI avec les deux valeurs en paramètres (traitement)

end;



Le traitement fonctionne comme pour le code Sioc ,le code n' est exécuté que si la variable change d'état.

JeanMi
 
Ah, tu as eu à résoudre la même problématique que moi !

J'ai résolu celle-ci en ajoutant une temporisation paramétrable entre chaque lancement de logiciel ... C'est moins élégant que ta solution :p

Lanceur d'application de Fab
 
Bonjour Fab ,
Si on pense un peu plus loin la solution pré citée nous permet de faire n'importe quel driver pour prosim ...
Donc dans mon cas ,je vais faire le driver prosim pour les cartes d'axes Soprolec.
J'ai la Dll avec les fonctions pour communiquer avec cette carte.
Après pas mal de discutions ,j'ai demandé à Julian Moyano de chez prosim le Sdk prosim en C++.Je me suis engagé à ne pas le distribuer.
J'ai tout en main pour enfin faire le driver pour mes cartes d'axes quand j'aurai fini mon code de démarrage.

JeanMi
 
Retour
Haut