Arret d'application console

Résolu
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008 - 4 mai 2007 à 15:36
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008 - 3 juil. 2007 à 11:03
bonjour à tous,
me revoilou avec un autre pb sur mon projet qui dure, qui dure...
j'ai une appli GUI avec un bouton qui lance une appli console... le pb est que je voudrais la fermer proprement aussi depuis mon appli GUI avec un autre bouton mais je ne sais pas comment faire!
voici le code de l'appli GUI:

procedure TfrmMeasureConsoleTest.btOnClick(Sender: TObject);
begin
// Lancement des mesures
  Finish := False;


  // Blabla de config...
  CmdLine := PChar(IntToStr(SmallInt(ConverterAccuracy))
               + ' ' + IntToStr(SmallInt(PresentModulesCount))
               + ' ' + IntToStr(SmallInt(MovingWay))
               + ' ' + BoolToStr(LogicalInputs));




  sStorePath := GetEnvironmentVariable('BDSPROJECTSDIR');


  pstupinfomes.cb := SizeOf(pstupinfomes);
  pstupinfomes.lpTitle := PAnsiChar('Console de mesure');
  pstupinfomes.dwFlags := STARTF_USESHOWWINDOW;
  pstupinfomes.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  pstupinfomes.wShowWindow := SW_SHOWMINIMIZED;  // SW_SHOWMINIMIZED
                                              // ou SW_SHOWNORMAL
                                              // ou SW_HIDE
//  pstupinfomes.hStdInput := ;
//  pstupinfomes.hStdOutput := ;
//  pstupinfomes.hStdError := ;


  if not CreateProcess( PChar(sStorePath+'\Bpl\En test\MesConsole.exe'),
                        PChar(CmdLine),
                        nil,
                        nil,
                        TRUE,
                        CREATE_NEW_CONSOLE, // 0 ou CREATE_NEW_CONSOLE
                        nil,
                        PChar(sStorePath+'\Bpl\En test'),
                        pstupinfomes,
                        pprocinfomes)
    then Exception.Create('Erreur à la création de la console de mesure');


end;


procedure TfrmMeasureConsoleTest.btOffClick(Sender: TObject);
begin
// Arrêt des mesures            là je sais que je suis complètement ds les choux
  Finish := True;


end;

voici le code de l'appli console:

program MesConsole;


{$APPTYPE CONSOLE}


uses
  SysUtils,
  Windows,
  Dialogs,
  uParalPortR in '..\MesSources\uParalPortR.pas',
  uCommonTypesandValues in '..\MesSources\uCommonTypesandValues.pas';


const BUFSIZE = 4096;
  kernel32 = 'kernel32.dll';
  shell32 = 'shell32.dll';


function GetCommandLineW(): PWideChar; stdcall; external kernel32;
function CommandLineToArgvW(lpCmdLine: PWideChar; pNumArgs: PInteger): PPWideChar; stdcall; external shell32;




var
//  hChildStdInRd, hChildStdInWr, hChildStdInWrDup,
//  hChildStdOutRd, hChildStdOutWr, hChildStdOutRdDup,
//  hInputFile, hSaveStdIn, hSaveStdOut : THandle;


  WalkMeasureAcquirer : TMeasureAcquirer;
  OneCompleteMeasure : TCompleteMeasure;
  dwRead, dwWritten : DWORD;
  sRead, sWrite : String;
  i,n : Integer;
  p : Array[0..3] of String;
  sz : SmallInt;
//  len : Integer;
//  wbn : Cardinal;
//  pOvLap : POverlapped;
//  saEventSecAttr : PSecurityAttributes;
  RTLCriticSection : TRTLCriticalSection;
  cmdln : PChar;
  convacc : SmallInt = -1;
  convrng : SmallInt = -1;
  prsmodcnt : SmallInt = -1;
  walkway : SmallInt = -1;
  alarms : Boolean;
//var
    MeasureTime : TLargeInteger;
    hs : SmallInt;
    chId : SmallInt;


//procedure ErrorExit(const ErrStr : PAnsiChar);
//var
//  hStdErr : THandle;
//begin
//  hStdErr := GetStdHandle(STD_ERROR_HANDLE);
//  WriteLn(hStdErr, ErrStr);
//  ExitProcess(0);
//end;


//function CreateChildProcess : Boolean;
//var piProcInfo : _PROCESS_INFORMATION;
//    siStartInfo : _STARTUPINFOA;
//    bFuncRetn : Boolean;
//begin
//  bFuncRetn := FALSE;
//
//// Set up members of the PROCESS_INFORMATION structure.
//  ZeroMemory( @piProcInfo, SizeOf(_PROCESS_INFORMATION) );
//
//// Set up members of the STARTUPINFO structure.
//  ZeroMemory( @siStartInfo, SizeOf(_STARTUPINFOA) );
//  siStartInfo.cb := SizeOf(_STARTUPINFOA);
//
//// Create the child process.
//  bFuncRetn := CreateProcess( nil,
//                              'child',     // command line
//                              nil,         // process security attributes
//                              nil,         // primary thread security attributes
//                              TRUE,        // handles are inherited
//                              0,           // creation flags
//                              nil,         // use parent's environment
//                              nil,         // use parent's current directory
//                              siStartInfo, // STARTUPINFO pointer
//                              piProcInfo); // receives PROCESS_INFORMATION
//
//  if (not bFuncRetn)
//    then ErrorExit('CreateProcess failed')
//    else begin
//           CloseHandle(piProcInfo.hProcess);
//           CloseHandle(piProcInfo.hThread);
//         end;
//  Result := bFuncRetn;
//end;


//procedure WriteToPipe;
//var dwRead, dwWritten : DWORD;
//    chBuf : PAnsiChar;
//    i : Integer;
//begin
//
//  // Read from a file and write its contents to a pipe.
//  for i:=0 to BUFSIZE do
//    begin
//      if (not ReadFile(hInputFile, chBuf, BUFSIZE, dwRead, nil) or (dwRead=0))
//        then Break;
//      if not WriteFile(hChildStdInWrDup, chBuf, dwRead, dwWritten, nil)
//        then Break;
//    end;
//
//  // Close the pipe handle so the child process stops reading.
//  if not CloseHandle(hChildStdInWrDup)
//    then ErrorExit('Close pipe failed');
//end;


//procedure ReadFromPipe;
//var dwRead, dwWritten : DWORD;
//    chBuf : PAnsiChar;
//    hStdout : Integer;
//    i : Integer;
//begin
//  hStdOut := GetStdHandle(STD_OUTPUT_HANDLE);
//
//  // Close the write end of the pipe before reading from the
//  // read end of the pipe.
//  if not CloseHandle(hChildStdOutWr)
//    then ErrorExit('Closing handle failed');
//
//  // Read output from the child process, and write to parent's STDOUT.
//  for i:=0 to BUFSIZE do
//    begin
//      if ((not ReadFile( hChildStdOutRdDup, chBuf, BUFSIZE, dwRead, nil)) or (dwRead=0))
//        then Break;
//      if (not WriteFile(hSaveStdOut, chBuf, dwRead, dwWritten, nil))
//        then Break;
//    end;
//end;


procedure ExecProg;
var mescnt : Integer;
begin
  try
    mescnt := WalkMeasureAcquirer.GetEntireMeasure;
    if mescnt=0
      then begin
             //Définit ExitCode <> MEASURE_NO_ERROR pour indiquer la condition d'erreur (par convention)
             ExitCode := GetLastError;
             //Gérer la condition d'erreur
             sWrite := 'Exception imprévue ' + IntToStr(ExitCode)
                         + ' dans la procédure de mesure. Mesure n° '
                         + IntToStr(OneCompleteMeasure.elMeasureCount)
                         + ' à ' + DateTimeToStr(Now);
             raise Exception.Create(sWrite);
             Exit;
           end
      else begin
             try
               Inc(OneCompleteMeasure.elMeasureCount);
//               OneCompleteMeasure.elMeasureCount := WalkMeasureAcquirer.GetMeasureCount;
               OneCompleteMeasure.elDeviceClockCount := WalkMeasureAcquirer.GetDeviceClockCount;
               OneCompleteMeasure.elSystemClockCount := WalkMeasureAcquirer.GetSystemClockCount;
               OneCompleteMeasure.elTOR := WalkMeasureAcquirer.GetTORStatus;
               OneCompleteMeasure.elDeviceValues := WalkMeasureAcquirer.EntireMeasure;
             except
               //Définit ExitCode <> MEASURE_NO_ERROR pour indiquer la condition d'erreur (par convention)
               ExitCode := MEASURE_STORING_ERROR;
               //Gérer la condition d'erreur
               Dec(OneCompleteMeasure.elMeasureCount);
               sWrite := 'Exception imprévue ' + IntToStr(GetLastError)
                           + ' dans la procédure de mesure '
                           + ' (' + IntToStr(ExitCode) + '). Mesure n° '
                           + IntToStr(OneCompleteMeasure.elMeasureCount)
                           + ' à ' + DateTimeToStr(Now);
               raise Exception.Create(sWrite);
               Exit;
             end;
           end;


                    // Traitement des alarmes
                    // A PERSONNALISER................................
                    case OneCompleteMeasure.elTOR of
//                      0     : begin
                      0..15 : begin
                                // Stockage dans un fichier texte pour affichage temporaire
                                sWrite := 'Mesure n° '
                                            + IntToStr(OneCompleteMeasure.elMeasureCount)
                                            + ' effectuée à ' + IntToStr(OneCompleteMeasure.elSystemClockCount)
                                            + ' : ';
                                for hs:=SmallInt(hsLeft) to SmallInt(hsRight)
                                  do for chId:=SmallInt(chHWCntTOR) to SmallInt(chC)
                                    do if (hs=SmallInt(hsLeft)) and (chId=SmallInt(chHWCntTOR))
                                         then sWrite := sWrite  + IntToStr(OneCompleteMeasure.elDeviceValues[THandSide(hs),TChannelIndex(chId)])
                                         else sWrite := sWrite  + ' / '
                                                   + IntToStr(OneCompleteMeasure.elDeviceValues[THandSide(hs),TChannelIndex(chId)]);
                                sWrite := sWrite  + ' ( alarmes TOR : ' + IntToStr(OneCompleteMeasure.elTOR) + ' ) ';


                                // Stockage dans un fichier de données
                                sz := SizeOf(OneCompleteMeasure);
                                WriteFile( hDataFileHandle,
                                           OneCompleteMeasure,
                                           sz,
                                           dwWritten,
                                           nil);
                              end;
//                      1..15 : begin
//                                //Définit ExitCode <> MEASURE_NO_ERROR pour indiquer la condition d'erreur (par convention)
//                                ExitCode := EXTERNAL_EVENT_ERROR;
//                                //Gérer la condition d'erreur
//                                sWrite := 'Exception imprévue ' + IntToStr(GetLastError)
//                                            + ' dans la procédure de mesure '
//                                            + ' (' + IntToStr(ExitCode) + '). Mesure n° '
//                                            + IntToStr(OneCompleteMeasure.elMeasureCount)
//                                            + ' à ' + DateTimeToStr(Now);
//                                raise Exception.Create(sWrite);
//                              end;
                      else begin
                             //Définit ExitCode <> MEASURE_NO_ERROR pour indiquer la condition d'erreur (par convention)
                             ExitCode := EXTERNAL_EVENT_ERROR;
                             //Gérer la condition d'erreur
                             sWrite := 'Exception imprévue ' + IntToStr(GetLastError)
                                         + ' dans la procédure de mesure '
                                         + ' (' + IntToStr(ExitCode) + '). Mesure n° '
                                         + IntToStr(OneCompleteMeasure.elMeasureCount)
                                         + ' à ' + DateTimeToStr(Now);
                             raise Exception.Create(sWrite);
                           end;
                      end;
  finally
    WriteLn(fTxtFile, sWrite );
  end;
end;




///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////// PROGRAMME PRINCIPAL /////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
begin
  { TODO -oUser -cConsole Main : placez le code ici }
    // PARAMETRES A ENVOYER LORS DE L'EXECUTION //
    //            PAR LIGNE DE COMMANDE OU      //
    //              EN TANT QUE SERVICE         //


//  cmdln := PChar( IntToStr(SmallInt(caLow))
//                    + ' ' + IntToStr(SmallInt(mcMax))
//                    + ' ' + IntToStr(SmallInt(mwAway))
//                    + ' ' + BoolToStr(False, True));


//  cmdln := PChar( IntToStr(SmallInt(caHigh))
//                    + ' ' + IntToStr(SmallInt(mcMin))
//                    + ' ' + IntToStr(SmallInt(mwBack))
//                    + ' ' + BoolToStr(True, True));


  cmdln := GetCommandLine;




    //////////////////////////////////////////////
  ExitCode := MEASURE_NO_ERROR;
  Finish := False;
  try
    // Text File Creation
    try
      AssignFile(fTxtFile,sTxtFileName);
      Rewrite(fTxtFile);
      sWrite := DateTimeToStr(Now);
      WriteLn(fTxtFile,sWrite);
    except
      //Définit ExitCode <> MEASURE_NO_ERROR pour indiquer la condition d'erreur (par convention)
      ExitCode := MEASURE_FILE_CREATION_ERROR;
      //Gérer la condition d'erreur
      sWrite := 'Exception imprévue dans la création du fichier texte '
                  + IntToStr(GetLastError) + ' (' + IntToStr(ExitCode) + ')';
      raise Exception.Create(sWrite);
      CloseFile(fTxtFile);
      ExitProcess(ExitCode);
    end;


    // Data File Creation
    try
      hDataFileHandle := CreateFile( PChar(sDataFileName),
                                  GENERIC_READ or GENERIC_WRITE,
                                  FILE_SHARE_READ or FILE_SHARE_WRITE,
                                  saDataFileSecAttr,
                                  CREATE_ALWAYS,
                                  FILE_ATTRIBUTE_NORMAL,
                                  0);


    except
      //Définit ExitCode <> MEASURE_NO_ERROR pour indiquer la condition d'erreur (par convention)
      ExitCode := MEASURE_FILE_CREATION_ERROR;
      //Gérer la condition d'erreur
      sWrite := 'Exception imprévue dans la création du fichier texte '
                  + IntToStr(GetLastError) + ' (' + IntToStr(ExitCode) + ')';
      raise Exception.Create(sWrite);
      ExitProcess(ExitCode);
    end;


    // Interprétation de la ligne de commande
    try
      sWrite := '';
      n := 0;
      for i:=0 to Length(cmdln)
        do begin
             if ((cmdln[i] <>' ') and (cmdln[i] <>#0))
               then sWrite := sWrite + cmdln[i]
               else begin
                      p[n] := sWrite;
                      Inc(n);
                      sWrite := '';
                    end;
           end;
      convacc := StrToInt(p[0]);
      prsmodcnt := StrToInt(p[1]);
      walkway := StrToInt(p[2]);
      alarms := StrToBool(p[3]);
//      sWrite := IntToStr(convacc)
//             + ' ' + IntToStr(prsmodcnt)
//             + ' ' + IntToStr(walkway)
//             + ' ' + BoolToStr(alarms,True);
//      WriteLn(fTxtFile, sWrite );
    except
      //Définit ExitCode <> MEASURE_NO_ERROR pour indiquer la condition d'erreur (par convention)
      ExitCode := MEASURE_COMMMANDLINE_ERROR;
      //Gérer la condition d'erreur
      sWrite := 'Exception imprévue dans la configuration du système '
                  + IntToStr(GetLastError) + ' (' + IntToStr(ExitCode) + ')';
      WriteLn(fTxtFile, sWrite );
      raise Exception.Create(sWrite);
      ExitProcess(ExitCode);
    end;


    // Création de l'objet carte d'acquisition
    try
      WalkMeasureAcquirer := TMeasureAcquirer.CreateSelf( TModulesCount(prsmodcnt),
                                                          TConverterAccuracy(convacc),
                                                          TMovingWay(walkway),
                                                          alarms);
      sWrite := IntToStr(SmallInt(WalkMeasureAcquirer.GetSensorsAccuracy))
             + ' ' + IntToStr(SmallInt(WalkMeasureAcquirer.GetModulesCount))
             + ' ' + IntToStr(SmallInt(WalkMeasureAcquirer.GetMovingWay))
             + ' ' + IntToStr(WalkMeasureAcquirer.GetSystemClockFreq)
             + ' ' + BoolToStr(WalkMeasureAcquirer.GetTORActivation,True);
      WriteLn(fTxtFile, sWrite );
    except
      //Définit ExitCode <> MEASURE_NO_ERROR pour indiquer la condition d'erreur (par convention)
      ExitCode := MEASURE_SYSTEM_CONFIG_ERROR;
      //Gérer la condition d'erreur
      sWrite := 'Exception imprévue dans la définition du système '
                  + IntToStr(GetLastError) + ' (' + IntToStr(ExitCode) + ')';
      WriteLn(fTxtFile, sWrite );
      raise Exception.Create(sWrite);
      ExitProcess(ExitCode);
    end;


    // Création de la variable de mesure
    try
      OneCompleteMeasure.elMeasureCount := 0;
      OneCompleteMeasure.elTOR := 0;
      sWrite := IntToStr(Integer(OneCompleteMeasure.elMeasureCount))
             + ' ' + IntToStr(OneCompleteMeasure.elSystemClockCount)
             + ' ' + IntToStr(SizeOf(OneCompleteMeasure.elDeviceValues))
             + ' ' + IntToStr(OneCompleteMeasure.elTOR)
             + ' ' + IntToStr(SizeOf(OneCompleteMeasure));
      WriteLn(fTxtFile, sWrite );
    except
      //Définit ExitCode <> MEASURE_NO_ERROR pour indiquer la condition d'erreur (par convention)
      ExitCode := MEASURE_OBJECT_CREATION_ERROR;
      //Gérer la condition d'erreur
      sWrite := 'Exception imprévue dans la création de la variable de données '
                  + IntToStr(GetLastError) + ' (' + IntToStr(ExitCode) + ')';
      WriteLn(fTxtFile, sWrite );
      raise Exception.Create(sWrite);
      ExitProcess(ExitCode);
    end;


    // Initialize the critical section one time only.
    try
      InitializeCriticalSection(RTLCriticSection);
    except
      //Définit ExitCode <> MEASURE_NO_ERROR pour indiquer la condition d'erreur (par convention)
      ExitCode := MEASURE_CRITICAL_SECTION_CREATION_ERROR;
      //Gérer la condition d'erreur
      sWrite := 'Exception imprévue dans la création de la variable de données '
                  + IntToStr(GetLastError) + ' (' + IntToStr(ExitCode) + ')';
      WriteLn(fTxtFile, sWrite );
      raise Exception.Create(sWrite);
      ExitProcess(ExitCode);
    end;


    // Création du processus enfant
//    try
//      CreateChildProcess;
//    except
//      ExitProcess(ExitCode);
//    end;


    // Boucle de programme
    while not Finish do
      begin
        try
          // Prise de mesure
          EnterCriticalSection(RTLCriticSection);
          ExecProg;
          LeaveCriticalSection(RTLCriticSection);


          // Temporisation
          Sleep(1);
        except
          //Définit ExitCode <> 0 pour indiquer la condition d'erreur (par convention)
          ExitCode := MEASURE_MAINLOOP_ERROR;


//////          SetLastError




          //Gérer la condition d'erreur
          sWrite := 'Fin de programme dûe à une exception dans la boucle principale'
                  + IntToStr(GetLastError) + ' (' + IntToStr(ExitCode) + ')';
          WriteLn(fTxtFile, sWrite );
          raise Exception.Create('Exception imprévue dans la boucle principale');
          ExitProcess(ExitCode);
        end;
      end;
  finally
    DeleteCriticalSection(RTLCriticSection);
    if ExitCode=MEASURE_NO_ERROR
      then sWrite := 'Application réussie'
      else sWrite := 'Application avortée';
    WriteLn(fTxtFile, sWrite);
    sWrite := DateTimeToStr(Now);
    WriteLn(fTxtFile, sWrite );
    CloseFile(fTxtFile);
    WalkMeasureAcquirer.Free;
    CloseFile(fTxtFile);
    CloseHandle(hDataFileHandle);
    ExitProcess(ExitCode);
  end;
end.

je sais que je suis nul et je ne demande qu'à m'améliorer! par pitié aidez-moi!
et pardonnez mon post trop long!
bonne journée à vous et à très vite j'espère









<hr />




si Delphi m'était conté...

16 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
4 mai 2007 à 15:55
Salut,
Hum, c'est vrai que c'est un peu chaud de s'y retrouver dans ton code ^^.
Je ne sais pas si c'est la méthode la plus propre mais voila ce que je te propose :
<li>Ton prog principal crée un Event (CreateEvent) avec un nom bien précis, avec comme état initial "False".</li><li>Ton prog console ouvre l'évènement grâce à son nom: il obtient son Handle.</li><li>Dans la boucle principale de de ton prog console, tu fais un test sur l'état de l'Event (avec WaitForSingleObject). Si la fonction échoue, tu continues ton programme. Si elle réussit, tu le quitte.</li><li>Et donc, pour arreter le prog console, le prog principal n'a qu'a faire signaler l'évènement avec un SetEvent().</li>Si tu connais le principe des évenements, c'est tout bon. Sinon, il va falloir que tu jettes un oeil dans la MSDN.

++
0
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008
7 mai 2007 à 14:03
merci bien pour ton aide.
j'ai cherché à faire ce que tu m'as conseillé et je n'y suis pas arrivé.
effectivement j'ai bcp de mal à comprendre et à assimiler certaines choses...
j'ai donc jeté un oeil dans la MSDN sans plus de succès.
peut-être le meilleur moyen de comprendre serait un petit exemple d'appli console commandée par une appli GUI, si tu as ça en stock...
car je me doute que dans ma grande ignorance, j'ai accumulé les aberrations dans ce code!
mais sache que je ne suis nullement analyste-programmeur et que je m'évertue à sortir qqch de pro sur un projet qui n'en est pas un...
merci d'avance

<hr />si Delphi m'était conté...
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
7 mai 2007 à 14:16
Hum ,éventuellement, je peux voir ce que j'ai en stock.
Je te rapelle si j'ai qqch.
0
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008
7 mai 2007 à 14:25
en fait je ne suis pas un pro dans l'utilisation des structures de windows et tout ça!
et je dois après ça mettre en place une base de données pour stocker l'ensemble des récapitulatifs des tests effectués.

<hr />si Delphi m'était conté...
0

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

Posez votre question
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
7 mai 2007 à 14:38
Qui est réellement pro dans ce domaine ? Sachant qu'il y a au moins 6 façons différentes de copier un fichier, comment peut-on réellement TOUT connaitre ?

C'est sur, ya des masses dans ce domaines, mais ils sont peu nombreux...
0
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008
7 mai 2007 à 17:01
Bon je crois qu'en fait il faut que je pose la qst fondamentale: c'est quoi un appli console? Peut-on faire l'amalgame entre appli console et service par exemple? Service que j'ai essayé d'élaborer mais sans succès, surtout en étant seul, sans connaissances approfondies de la programmation objet, et surtout ayant peur de torpiller mon pc définitivement...
A la limite, si tu connais un bon endroit qui propose une bonne formation intensive et complète de longue durée en programmation, dis-le moi lol
Sérieux, tous mes essais se basent sur des exemples copiés-collés que j'ai essayé d'adapter à mon problème. d'autant que je me suis vu refuser de concevoir avec µP la fameuse carte d'acquisition que l'on conçoit, que mon chef s'évertue à vouloir piloter à 100% par un port parallèle voué à disparaître, mais avec un compteur pour connaître la durée d'interruption, le nb de mesures manquées, et reconstituer ainsi les mesures loupées par calcul. Et encore, je ne me suis pas essayé à .NET! Déjà qu'avec Win32 je rame!
Bon allez une journée supplémentaire de gâchée... On se recontacte après le 8 mai ;-)

<hr />si Delphi m'était conté...
0
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008
9 mai 2007 à 10:52
merci merci merci merci merci merci merci à toi, ô grand manitou!
lol franchement y a pas mieux pour comprendre!
parce que mon pb en général c'est de savoir où on met quoi et comment on l'utilise!
tu me diras "fais une formation" et je suis tt à fait d'accord, d'ailleurs j'y bosse!
j'éviterai toutefois de venir t'embêter toutes les 5 minutes pour autant...

<hr />si Delphi m'était conté...
0
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008
15 mai 2007 à 13:15
euh maintenant j'ai un autre problème...
je ne sais pas si ça vient de mon source car ça fait pareil avec l'exemple de florenth.
en fait le débogueur bogue quand je veux fermer mon appli principale VCL.
la console elle semble se fermer correctement.
j'ignore si c'est à cause d'un handle qui reste ouvert, ou de mon appli vcl qui ne répond plus ou encore d'une mauvaise configuration de mon borland...
ne faudrait-il pas, à l'instar des threads qui disposent d'une méthode WaitFor, attendre de recevoir une confirmation comme quoi toute la mémoire a été libérée?

<hr />si Delphi m'était conté...
0
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008
15 mai 2007 à 15:38
après avoir retiré la procédure formdestroy il semblerait que ça fonctionne mieux.
la libération du TEvent ne serait-elle pas prise en charge implicitement à la destruction de la fiche?

<hr />si Delphi m'était conté...
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
15 mai 2007 à 18:16
Non, la destruction de l'évent ne se fait automatiquement que lorsque le handle du thread qui l'a crée est libéré, pas quand une fiche se ferme (c'est un objet multi-thread quand même, faut pas détruire ça n'importe comment).

Masi logiquement, même si tu transmet un Handle invalide, la fonction CloseHandle() n'échoue pas et ne crée aucune erreur. Donc le problème doit sûrement venir d'ailleurs...

Es-tu sûr de ne rien avoir d'autre dans le OnDestroy ?
0
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008
16 mai 2007 à 11:30
oui et j'ai même pompé ton exemple au maximum, en prenant ShellExecute, mais j'ai fait ça peut-être un peu vite. au préalable j'avais comparé nos codes, et je n'étais pas si loin de ce que tu as mis dans ton exemple... en tout cas, le résultat est le même, à savoir:

quand je ferme l'appli console, tout va bien. quand je ferme alors l'appli princiale, les chosses se gâtent...
une première fenêtre avec un message d'erreur m'affiche:
Erreur fatale du débogueur pendant la réinitialisation du processus: 'Processus de débogage non initialisé'. Veuillez sauvegarder votre travail et redémarrer Borland Delphi 2005.
je n'ai pas d'autre choix que valider par "Ok". l'affichage de l'éditeur ne se fait plus alors correctement, probablement le rafraîchissement dû à la monopolisation du processeur par le reste? en tout état de cause, je suis obligé de cliquer droit sur le bouton de D2005 ,dans la barre des tâches pour retrouver un affichage correct. le bureau actif est alors celui de débogage, et tous les boutons permettant de lancer, arrêter ou exécuter pas-à-pas sont désactivés. mais au moins, par le menu contextuel qui s'affiche sur la barre des tâches je peux fermer l'éditeur.
sauf que s'affiche là encore une fenêtre:
Limite de temps dépassée dans l'arrêt du processus.
ce à quoi je peux demander d'"Abandonner", d'"Ignorer", ou de "Retenter".
les deux autres boutons ne me donnant rien de plus, je choisis d'abandonner.
Apparaît alors une dernière fenêtre avec message d'erreur:
Violation d'accès à l'adresse036EEAEB dans le module 'dbkdebugide90.bpl'. Lecture de l'adresse 00000000.
Si je retente au lieu d'abandonner, cette fenêtre ne s'affiche pas mais ça ne m'avance à rien.
je peux donc ensuite par le biais de mon choix (clic droit sur la barre des tâches, bouton de fermeture de l'application, gestionnaire des tâches) fermer D2005, et le relancer enfin.
parfois il se relance avec le bureau par défaut, que j'utilise pour la conception, et avec la dernière configuration correcte connue, parfois avec le bureau de débogage...
je vais d'ailleurs voir s'il n'y a pas un os de ce côté-là, car j'ai installé et désinstallé pas mal de truc sous plusieurs profils (administrateur et utilisateur), en particulier GLScene, qui pour l'instant ne me sert à rien, et Free Pascal et Delphi Expert, que je me demande bien pourquoi je les ai installés.
en plus de ça j'ai sur mon poste tous les outils d'administration des postes du services, et je ne suis pas sûr que ce soit pour arranger les choses...
ne serait-il pas judicieux de désintaller et réinstaller tout bonnement D2005?

<hr />si Delphi m'était conté...
0
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008
16 mai 2007 à 11:52
petit rectificatif: quand je ferme l'appli principale, la fiche se ferme apparemment correctement, encore qu'un point d'arrêt sur la ligne de code de l'événement OnDestroy de la fiche ne soit pas pris en considération (????).
mais l'éditeur reste dans un état considérant le processus en train de tourner... comme un deadlock peut-être? mais alors au niveau du débogueur?
et c'est quand je clique sur le bouton rouge d'arrêt du processus actif que la première fenêtre s'affiche.
suis-je nul à ce point, que je ne sache pas faire tourner un truc apparemment si simple?

<hr />si Delphi m'était conté...
0
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008
16 mai 2007 à 15:48
bon voilà j'ai réinstallé D2005... juste ça, j'ai tout laissé tel quel au niveau des appli connexes.
j'ai fait le nécessaire pour la licence, et j'ai mm rien perdu de mes fichiers!
juste l'environnement de l'éditeur à personnaliser en couleurs, et je me suis bien gardé de trifouiller dans les options de fichiers et de l'éditeur!
tout semble redevenu dans l'ordre!
pour combien de temps, je l'ignore, mais ça semble lui avoir remis les idées en place! :p
tout baigne désormais! à moi d'apprendre à nager...
babaille

<hr />si Delphi m'était conté...
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
16 mai 2007 à 16:05
Bon ben tant mieux ! lol
Sinon, des fois, faut faire gaffe avec les "dcu de déboggage" (voir projet > options > compilo) qui peuvent provoquer des erreurs bizarres ...

++
0
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008
24 mai 2007 à 09:28
ah bon?
en tout cas maintenant je vais éviter de trop toucher aux paramètres!
je rame déjà assez comme ça...
à bientôt pour une nouvelle question! lol
bonne continuation

<hr />si Delphi m'était conté...
0
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008
3 juil. 2007 à 11:03
re!
dis si j'utilise un TStringList dans ma fiche, en champ propriété privé, est-ce que je dois écrire MonStringList := TStringList.Create dans le constructeur de la fiche, et MonStringList.Free dans son destructeur?
est-ce que ça suppose de commencer le constructeur et de finir le destructeur par inherited?

procedure TfrmMeasureApp.FormCreate(Sender: TObject);
var pchCommandLine : PAnsiChar;
    sDevice : String;
begin
  inherited;
  pchCommandLine := GetCommandLine;
  if sDevice='StrengthPlate'
    then FDeviceType := dtStrengthPlate;
  if sDevice='FatigueTest'
    then FDeviceType := dtFatigueTest;


  FJournal := TStringList.Create;
  FDeviceConfig := TStringList.Create;
  FTestInfos := TStringList.Create;


  rgWalkWay.Enabled :not (FDeviceType dtFatigueTest);


  // Création d'un événement avec un identificateur unique
  //   pour signaler la demande de fermeture de la console
  FMeasureConsoleCloseEvent := CreateEvent(nil, True, False, 'MEASURE_CONSOLE_CLOSE_EVENT');
//  FCalculateConsoleCloseEvent := CreateEvent(nil, True, False, 'CALC_CONSOLE_CLOSE_EVENT');
end;


procedure TfrmMeasureApp.FormDestroy(Sender: TObject);
begin
  // Libération des événements après fermeture de la console à la destruction de la fiche
  if CloseHandle(FMeasureConsoleCloseEvent)
    then MessageDlg('Handle d''événement correctement fermé', mtInformation, [mbOk], 0)
    else MessageDlg('Handle d''événement toujours ouvert', mtInformation, [mbOk], 0);
//  CloseHandle(FCalculateConsoleCloseEvent);
  FTestInfos.Free;
  FDeviceConfig.Free;
  FJournal.Free;
  inherited;
end;

en effet le débogueur ne se réinitialise pas correctement après que j'ai lancé et fermé mon appli console de mesure comme tu me l'as enseigné, et je dois fermer et relancer D2005 à chaque fois. jusqu'à présent il n'y avait pas de inherited, et je créais des instances de FTestInfos, FDeviceConfig et FJournal lors de la création de la fiche, et les libérais à sa libération.
mais je ne sais pas si c'est utile ou superflu.
merci
je ne sais pas si c'est la console qui merde, si c'est mon appli principale, ou si c'est un paramétrage soit dans les options des projets, soit dans celles de l'éditeur.









<hr />




si Delphi m'était conté...
0
Rejoignez-nous