Как использовать WaitForSingleObject - PullRequest
8 голосов
/ 31 марта 2010

Чтобы опробовать программирование с помощью Win32 API, я написал программу, которая создает процесс. Затем я хочу проверить, ждет ли мой процесс только что созданного процесса, закройте дескриптор и снова проверьте 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);
}

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

* +1007 *

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

Вместо оператора if-else я использовал это:

//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 заявлением?

Ответы [ 3 ]

21 голосов
/ 31 марта 2010

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

5 голосов
/ 31 марта 2010

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

Повышение значения возврата WaitForSingleObject до bool ИМХО не очень хорошая идея, учитывая, что вы получаете несколько потенциально светящихся ненулевых кодов возврата, которые указывают, почему истекло время ожидания.

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

3 голосов
/ 31 марта 2010

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

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

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

тебе нужно

if (retwait= WaitForSingleObject (pro2info.hProcess, INFINITE)==WAIT_OBJECT_0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...