Как использовать WaitForSingleObject

Чтобы испытать, как программировать с API Win32, я записал программу, которая создает процесс. Затем я хочу проверить, ожидает ли мой процесс недавно созданного процесса, закройте дескриптор и затем проверьте WaitForSingleObject снова (второй процесс спит для 700 мс),

Первый процесс:

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

Второй процесс:

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

Первый процесс печатает ложь, ложь; но это должно распечатать верный, ложный.

Вместо, если еще оператор, я использовал это:

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

И это, кажется, работает. Что я делал неправильно с моим if-else оператор?

9
задан Peter Mortensen 21 February 2013 в 15:01
поделиться

3 ответа

Вам действительно нужно обратить внимание на значение возвращаемого значения функций API. Вы не можете игнорировать ЛОЖНЫЙ возврат от CreateProcess (). WaitForSingleObject () может возвращать несколько значений, он возвращает 0, если ожидание завершилось успешно. Что заставляет вас печатать «ложь».

21
ответ дан 4 December 2019 в 07:34
поделиться

Согласно MSDN, WaitForSingleObject вернет WAIT_OBJECT_0, если ожидание не было прервано. Если вы посмотрите документацию, то значение WAIT_OBJECT_0 окажется 0x00000000L, которое обычно преобразуется в false, а не в true. Следовательно, ваше сравнение не работает.

Преобразование возвращаемого значения WaitForSingleObject в bool - IMHO не очень хорошая идея, учитывая, что вы получаете несколько потенциально интересных ненулевых кодов возврата, которые показывают, почему ожидание истекло.

Если вы все еще хотите сохранить приведенный выше код как использующий булеву проверку, измените тесты на !WaitForSingleObject(...) вместо.

5
ответ дан 4 December 2019 в 07:34
поделиться

Думаю, вы сами ответили на свой вопрос. Дело в том, что WaitForSingleObject возвращает не true или false, а WAIT_OBJECT_0 и т.д.

Так что вместо

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

нужно

if (retwait= WaitForSingleObject (pro2info.hProcess, INFINITE)==WAIT_OBJECT_0)
3
ответ дан 4 December 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: