2010-03-31 2 views
5

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

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

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

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

Вместо если-иначе заявления я использовал:

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

ответ

16

Вы действительно нужно обратить внимание на значение для возвращаемого значения функций API. Вы не можете игнорировать возврат FALSE из CreateProcess(). WaitForSingleObject() может возвращать несколько значений, он возвращает 0, если ожидание завершено успешно. Из-за чего вы печатаете «ложь».

5

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

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

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

2

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

Таким образом, вместо

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

вам нужно

if (retwait= WaitForSingleObject (pro2info.hProcess, INFINITE)==WAIT_OBJECT_0) 
Смежные вопросы