How to use WaitForSingleObject

To try how to program using the Win32 API, I wrote a program that creates a process. Then I want to check if my process is waiting for a newly created process, close the handle and then check WaitForSingleObject again (the second process is asleep for 700 μs)

First process:

#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);
}

Second process:

#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";
}

The first process prints false, false; but it should print true, false.

Instead of the if-else statement, I used this:

//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;

And that seems to work. What have I done wrong with my expression if-else?

+8
source share
3 answers

API. CreateProcess(). WaitForSingleObject() , 0, . "".

+21

MSDN, WaitForSingleObject WAIT_OBJECT_0, . , WAIT_OBJECT_0 0x00000000L, , false, true. , .

WaitForSingleObject bool IMHO , , , , .

, !WaitForSingleObject(...).

+5

I think you yourself answered your own question. The fact is that it WaitForSingleObjectdoes not return trueor false, but WAIT_OBJECT_0et al.

So instead

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

you need

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

All Articles