2010-03-31 14 views
5

Per provare come programmare con l'API Win32, ho scritto un programma che crea un processo. allora voglio verificare se il mio processo aspetta che il processo appena creato, chiudere la maniglia e quindi controllare WaitForSingleObject di nuovo (il secondo processo sta dormendo per 700   ms)Come utilizzare WaitForSingleObject

primo processo:

#include <iostream> 
#include <windows.h> 
#include <string> 

using namespace std; 

void main() 
{ 
    bool ret; 
    bool retwait; 

    STARTUPINFO startupinfo; 
    GetStartupInfo (&startupinfo); 

    PROCESS_INFORMATION pro2info; 

    wchar_t wcsCommandLine[] = L"D:\\betriebssystemePRA1PRO2.exe"; 

    ret = CreateProcess(NULL, wcsCommandLine, NULL, NULL, false, CREATE_NEW_CONSOLE, NULL, 
         NULL, &startupinfo, &pro2info); 

    cout<<"hProcess: "<<pro2info.hProcess<<endl; 
    cout<<"dwProcessId: "<<pro2info.dwProcessId <<endl; 

    if (retwait= WaitForSingleObject (pro2info.hProcess, INFINITE)==true) 
     cout<<"waitprocess:true"<<endl; //The process is finished 
    else 
     cout<<"waitprocess:false"<<endl; 

    CloseHandle (pro2info.hProcess);//prozesshandle schließen, "verliert connection" 

    if (retwait= WaitForSingleObject (pro2info.hProcess, INFINITE)==true) //When the process has finished 
     cout<<"waitprocess:true"<<endl; 
    else 
     cout<<"waitprocess:false"<<endl; 

    //cout<<GetLastError()<<endl; //Output the last error. 

    ExitProcess(0); 
} 

Seconda processo:

#include <iostream> 
#include <windows.h> 
#include <string> 

using namespace std; 

void main() 
{ 
    int b; 

    b = GetCurrentProcessId(); 

    cout << b << endl; 
    cout << "Druecken Sie Enter zum Beenden" << endl; 
    cin.get(); 
     //Wait until the user confirms 

    Sleep (700); 
    ExitProcess(0); 

    cout<<"test"; 
} 

Il primo processo stampa falso, falso; ma dovrebbe stampare vero, falso.

anziché l'istruzione if-else, ho usato questo:

//switch(WaitForSingleObject (pro2info.hProcess, INFINITE)){ 
    // case WAIT_OBJECT_0: cout << "ja"; 
    //  break; 
    // case WAIT_FAILED:cout << "nein"; 
    //  break; 
    // case WAIT_TIMEOUT: 
    //  break; 
    //} 
// cout<<"waitprocess:true"<<endl;//prozess ist fertig 
//else 
// cout<<"waitprocess:false"<<endl; 

E questo sembra funzionare. Cosa ho fatto di sbagliato con la mia istruzione if-else?

risposta

16

È davvero necessario prestare attenzione al significato per il valore di ritorno delle funzioni API. Non è possibile ignorare un ritorno FALSE da CreateProcess(). WaitForSingleObject() può restituire diversi valori, restituisce 0 se l'attesa è stata completata correttamente. Che ti fa stampare "falso".

5

Secondo MSDN, WaitForSingleObject restituirà WAIT_OBJECT_0 se l'attesa non è stata interrotta. Se si controlla la documentazione, il valore di WAIT_OBJECT_0 è 0x00000000L, che è il valore comunemente convertito in false, non true. Quindi il tuo confronto fallisce.

La promozione del valore restituito da WaitForSingleObject a bool non è una buona idea poiché si ottengono diversi codici di ritorno potenzialmente non illuminanti che indicano perché l'attesa è scaduta.

Se si desidera mantenere il codice sopra riportato utilizzando un controllo booleano, modificare i test su !WaitForSingleObject(...).

2

Penso che abbiate risposto alla vostra domanda da soli. Il punto è che WaitForSingleObject non restituisce true o false, ma WAIT_OBJECT_0 e altri.

Così, invece di

if (retwait= WaitForSingleObject (pro2info.hProcess, INFINITE)==true) 

è necessario

if (retwait= WaitForSingleObject (pro2info.hProcess, INFINITE)==WAIT_OBJECT_0)