2. Prozess stoppt die Anwendung und gibt sie erst nach Verarbeitung frei



  • Hallo Alle zusammen,

    ich habe wiedermal ein Pröblemchen, und weiss nicht, wie ich das am Besten lösen soll. 🙂 In meiner Anwendung rufe ich eine externe Konsolenanwendung auf, die eine eigene Verarbeitung durchführt und je nach Fortschritt der Verarbeitungsschritt einen "Zwischenbericht" ind er Konsole ausgibt. Nun ist es aber so, dass diese Anwendung ziemlich lange läuft, währenddessen ist auch meine Anwendung von allen Zugriffen durch den Benutzer gesperrt, d.h. ich kann erst auf meine Anwendung zugreifen, wenn der Prozess zuende ist.

    Allerdings würde ich es gerne so haben, dass meine Anwendung die Ausgabe der externen Konsolenanwendung im eigenen Fenster ausgibt und durch den anderen Prozess nicht blockiert wird, sondern ich den aktuellen Status bzw. Verarbeitungsschritt in meiner Anwendung sehe und jederzeit z.B. Abbrechen kann.

    Ich hab in meiner Anwendung folgende Funktion implementiert, die mir lediglich nur die gesamte Ausgabe am Ende der Verarbeitung des Prozesses ausgibt:

    CString C6RepositoryOperation_PEV::ExecuteExternalFile(CString csExeName, CString csArguments)
    {
      CString csExecute;
      csExecute=csExeName + " " + csArguments;
    
      SECURITY_ATTRIBUTES secattr; 
      ZeroMemory(&secattr,sizeof(secattr));
      secattr.nLength = sizeof(secattr);
      secattr.bInheritHandle = TRUE;
    
      HANDLE rPipe, wPipe;
    
      //Create pipes to write and read data
      CreatePipe(&rPipe,&wPipe,&secattr,0);
      //
      STARTUPINFO sInfo; 
      ZeroMemory(&sInfo,sizeof(sInfo));
      PROCESS_INFORMATION pInfo; 
      ZeroMemory(&pInfo,sizeof(pInfo));
      sInfo.cb=sizeof(sInfo);
      sInfo.dwFlags=STARTF_USESTDHANDLES;
      sInfo.hStdInput=NULL; 
      sInfo.hStdOutput=wPipe; 
      sInfo.hStdError=wPipe;
      char command[1024]; strcpy(command,  
              csExecute.GetBuffer(csExecute.GetLength()));
    
      //Create the process here.
      CreateProcess(0, command,0,0,TRUE, NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW,0,0,&sInfo,&pInfo);
      CloseHandle(wPipe);
    
      //now read the output pipe here.
      char buf[100];
      DWORD reDword; 
      CString m_csOutput,csTemp;
      BOOL res;
      do
      {
                      res=::ReadFile(rPipe,buf,100,&reDword,0);
                      csTemp=buf;
                      m_csOutput+=csTemp.Left(reDword);
      }while(res);
      return m_csOutput;
    }
    
    /* Die Methode getPathName gibt den vollen Namen des Pfades von der Anwendung zurück*/
    CString C6RepositoryOperation_PEV::getPathName() {
    
    	char szBuffer[MAX_PATH+2];
    	char szPfad[MAX_PATH+2];
    	char *pFilename;
    
    	GetModuleFileName (NULL, szBuffer, MAX_PATH);
    
    	GetFullPathName (szBuffer, sizeof (szBuffer), szPfad, &pFilename);
    
    	szPfad[pFilename-szPfad] = '\0';
    
    	return szPfad;
    }
    

    Kann mir jemand da weiterhelfen, es muss doch die Möglichkeit bestehen, dass sowas realisierbar ist, oder? Ich würde gerne, sobald das externe Programm eine Zeile in der Konsole ausgibt, diese abfangen und in meinem Programm ausgeben...

    Gruss,
    chullain



  • Dein Thread steht in der DoWhile, da Du dort die Windows-Messages nit abarbeitest, wird auch deine Anzeige nicht aktualisiert. Entweder das ganze in einen Thread Packen, oder in deiner DoWhile die Windows-Messages mit Abarbeiten.

    ...
    CString m_csOutput,csTemp;
    MSG msg;
    BOOL res;
      do
      {
                      res=::ReadFile(rPipe,buf,100,&reDword,0);
                      csTemp=buf;
                      m_csOutput+=csTemp.Left(reDword);
                      while( ::PeekMessage( &msg, NULL, NULL, NULL, PM_NOREMOVE ) )
                          ::AfxGetThread()->PumpMessage();
      }while(res);
    

    Sollte so gehen, hab es aber nicht versucht.

    Gruß Matthias



  • Hallo,

    ich hab das jetzt versucht, die Windows-Messages so abzuarbeiten, wie Du sie mir aufgeschrieben hast, jedoch verschwindet mein Hauptfenster und kehrt erst wieder zurück, wenn der 2.Prozess abgearbeitet ist.

    Wie kann ich das am Besten mit Threads durchführen, ich will jetzt nicht so ankommen, als ob ich alles vorgekaut bekommen möchte, aber nur ne kleine Gedankenstütze wäre nicht schlecht, hab mich noch nie mit Thread bzw. Windows-Mes. befasst.

    Danke.

    Gruss,
    chullain


Anmelden zum Antworten