2014-07-10 37 views
0

因此,我在Win32中通過主OpenGL窗口創建了一個控制檯,以便使用它爲我的事件循環生成命令。但是,我有一些困難。控制檯反覆檢查CIN輸入,使用以下循環:從另一個線程中關閉WINAPI中的重定向控制檯

while (*loopEnabled) 
{ 
    string str; 
    getline(cin, str); 

    if (str == "quit") 
    { 
     PostQuitMessage(0); 
     return; 
    } 
} 

這是在一個單獨的線程從我的主窗口中運行,並且是爲了發送退出事件並退出。但是,首先,退出消息似乎並不完全工作。似乎發生的是,這隻允許主窗口關閉 - 我仍然需要手動關閉主窗口。看來PostQuitMessage不會爲我處理適當的Windows事件?也許我在這裏犯了一些錯誤。

更深遠的問題實際上是從控制檯線程外部退出此事件循環,而不必輸入隨機輸入,以便它移過常數getline並在條件失敗時退出。我試圖通過嘗試提供虛假輸入來做到這一點,但我無法做到這一點。它可能與輸入被重定向到控制檯有關。也許例外可能工作?我不知道。

下面是重定向IO到控制檯的代碼:

AllocConsole(); 

handleOut = GetStdHandle(STD_OUTPUT_HANDLE); 
int hCrt = _open_osfhandle((long)handleOut, _O_TEXT); 
hfOut = _fdopen(hCrt, "w"); 
setvbuf(hfOut, NULL, _IONBF, 0); //Can assign custom buffer here! Currently no buffering (_IONBF) 
*stdout = *hfOut; 

handleIn = GetStdHandle(STD_INPUT_HANDLE); 
hCrt = _open_osfhandle((long)handleIn, _O_TEXT); 
hfIn = _fdopen(hCrt, "r"); 
setvbuf(hfIn, NULL, _IOLBF, 256); 
*stdin = *hfIn; 

摘要: 我有窗口和控制檯。我關閉窗口,它等待控制檯輸入以獲取循環中的getline。我在控制檯中輸入「quit」,控制檯循環結束,但主窗口沒有注意到。幫幫我? .-。我對Windows編程頗爲陌生。

+1

錯誤的線程,每個線程都有自己的消息隊列。你將不得不PostMessage()WM_QUIT消息。當然,知道要將它發佈到哪個窗口,從來不會在想要混淆UI線程的工作線程中留下細節。 –

回答

1

PostQuitMessage()向正在調用它的線程的消息隊列發送WM_QUIT消息。您的控制檯循環運行在其自己的線程中,因此您的主窗口在其他線程中運行將永遠不會收到WM_QUIT消息。要將WM_QUIT消息發佈到另一個線程中的窗口,請改爲使用PostMessage()

std::getline()直到用戶在控制檯中鍵入一行文本纔會退出。正如你所看到的,這不允許你終止控制檯線程。 std::cin不會告訴你什麼時候有文本可供閱讀,所以你只有在需要閱讀內容時纔可以選擇撥打std::getline()。嘗試切換到ReadConsole()ReadConsoleInput()。然後,您可以使用WaitForSingleObject()來檢測何時可以讀取輸入。這將使您有機會在每次讀取之間監視線程是否存在任何終止條件,例如布爾變量。或者,使用等待event object來表示終止,然後您可以使用WaitForMultipleObjects()同時等待終止和輸入,它會告訴您要執行哪個信號。

相關問題