Avatar billede bumle90 Nybegynder
02. marts 2004 - 14:46 Der er 7 kommentarer og
1 løsning

uendelig lykke ved kald til GetExitCodeProcess

Hej, jeg har et program der opretter en process. Herefter er det meningen mit program skal vente indtil denne process er helt færdig og har termineret.
Herefter skal mit program fortsætte.
Jeg har lavet følgende kode som går i uendelig while-løkke:
Hvis nogle umiddelbart kan se en fejl...plz tell me :)
            string command;
            char command1[1024];
            command=XLStretch;
            command.append(" r ");
            command.append("\"");
            command.append(oldpath);
            command.append("\"");
           
            strcpy(command1,command.c_str());

            STARTUPINFO si;
            PROCESS_INFORMATION pi;
            ZeroMemory( &si, sizeof(si));
            si.cb = sizeof(si);
            ZeroMemory( &pi, sizeof(pi));
            CreateProcess(
                NULL,
                command1,
                NULL,
                NULL,
                FALSE,
                CREATE_NO_WINDOW | DETACHED_PROCESS | IDLE_PRIORITY_CLASS,
                NULL,
                NULL,
                &si,
                &pi);
        HANDLE hProc;
        hProc=pi.hProcess;
        DWORD lpExitCode;
        GetExitCodeProcess(hProc,&lpExitCode);
       
        while(lpExitCode==STILL_ACTIVE){
            cout<<"still alive"<<endl;
            GetExitCodeProcess(hProc,&lpExitCode);
        }
        system("PAUSE");
Avatar billede jpk Nybegynder
02. marts 2004 - 15:02 #1
Jeg kunne forestille mig følgende at processen aldrig får noget CPU-tid, da dens prioritet er meget lav (IDLE_PRIORITY_CLASS) og du laver BUSY WAIT!

Altså, din main proces tager al den CPU den kan få og "overlader" ikke noget til den anden proces.

Prøv istedet at bruge WaitForSingleObject til at vente på at den bliver færdig.
Avatar billede bumle90 Nybegynder
02. marts 2004 - 15:05 #2
Aha ja det tror jeg du har helt ret i.
Kunne du evt. lige lave et lille eksempelt med WaitForSingleObject  ?
Avatar billede jpk Nybegynder
02. marts 2004 - 15:12 #3
Fra MSDN:


#include <windows.h>
#include <stdio.h>

void main(void)
{
  PROCESS_INFORMATION pInfo;
  STARTUPINFO        sInfo;
  DWORD              exitCode;

  sInfo.cb              = sizeof(STARTUPINFO);
  sInfo.lpReserved      = NULL;
  sInfo.lpReserved2    = NULL;
  sInfo.cbReserved2    = 0;
  sInfo.lpDesktop      = NULL;
  sInfo.lpTitle        = NULL;
  sInfo.dwFlags        = 0;
  sInfo.dwX            = 0;
  sInfo.dwY            = 0;
  sInfo.dwFillAttribute = 0;
  sInfo.wShowWindow    = SW_SHOW;

  if (!CreateProcess(NULL,
                "command.com /c dir c:\\*.bat",
                      NULL,
                      NULL,
                      FALSE,
                      0,
                      NULL,
                      NULL,
                      &sInfo,
                      &pInfo)) {
      printf("ERROR: Cannot launch child process\n");
      exit(1);
  }

  // Give the process time to execute and finish
  WaitForSingleObject(pInfo.hProcess, 5000L);

  if (GetExitCodeProcess(pInfo.hProcess, &exitCode))
  {
      switch(exitCode)
      {
        case STILL_ACTIVE: printf("Process is still active\n");
                            break;
        default:          printf("Exit code = %d\n", exitCode);
                            break;
      }
  }
  else {
      printf("GetExitCodeProcess() failed\n");
  }
}
Avatar billede jpk Nybegynder
02. marts 2004 - 15:13 #4
Argument nr 2 er den tid du maksimalt vil vente i millisekunder. Du kan også bruge INFINITE hvis der ikke er nogen max tid.
Avatar billede bumle90 Nybegynder
02. marts 2004 - 15:16 #5
Nice :)
Takker..Må jeg spørge om noget til sidst?
Ved du om der i C++ Findes en funktion der kan konverterer en streng til lutter små bogstaver. (Ved godt der findes en i C som konverterer 1 char. Det er bare så jeg slipper for selv at lave en funktion der gør det hver gang jeg laver et program der skal bruge det. Og ved også godt at jeg bare kan ligge det i en header eller dll fil....Det ville nu bare være nemmere hvis det var i et eller andet standard lib :)
Men tak for hjælpen ellers...Du er en gut
Avatar billede jpk Nybegynder
02. marts 2004 - 15:21 #6
Igen, MSDN:

/* STRLWR.C: This program uses _strlwr and _strupr to create
* uppercase and lowercase copies of a mixed-case string.
*/

#include <string.h>
#include <stdio.h>

void main( void )
{
  char string[100] = "The String to End All Strings!";
  char *copy1, *copy2;
  copy1 = _strlwr( _strdup( string ) );
  copy2 = _strupr( _strdup( string ) );
  printf( "Mixed: %s\n", string );
  printf( "Lower: %s\n", copy1 );
  printf( "Upper: %s\n", copy2 );
}
Avatar billede bumle90 Nybegynder
02. marts 2004 - 17:31 #7
Det er meget fornemt. Tak skal du ha jpk :)
Avatar billede jpk Nybegynder
03. marts 2004 - 08:51 #8
Velbekomme, glad for at kunne hjælpe...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis