Есть поток считывания команд введных с консоли.
Цикл выборки примерно такой
do
{
...
char ch[256] = {0};
std::cin.getline(ch, 256);
....
} while( ... );
не факт что в консоль будет что то введено, этот канал не является основным канал прихода команд.
При завершении программы по альтернатевному пути, этот поток висит потому что
std::cin
не возвращает
управление. Знает ли кто как вывести
std::cin
из этого состояния? Вызов из другого потока
std::cin >> что нибудь
не помогает.
Возможно есть какие нибудь хаки, интересует windows платформа.
При работе с консолью я пользовал функцию _kbhit, чтобы определить, есть ли что читать. И, соответственно, читать только, если что-то есть.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, ioni, Вы писали:
I>Есть поток считывания команд введных с консоли.
I>Возможно есть какие нибудь хаки, интересует windows платформа.
Вот так получилось (с хаком, под Windows):
#include <windows.h>
#include <iostream>
int g_continue = 1;
DWORD WINAPI thStopper (LPVOID)
{
Sleep (3000);
g_continue = 0;
CloseHandle (GetStdHandle (STD_INPUT_HANDLE));
return 0;
} // thStopper
int main (int /* argc */, char* /* argv */[])
{
DWORD dwThreadId = 0;
HANDLE hThread = CreateThread (NULL, 0, thStopper, NULL, 0, & dwThreadId);
std::cout << "*** 1 ***" << std::endl;
do
{
char ch[256] = {0};
std::cout << "*** 2 ***" << std::endl;
std::cin.getline(ch, 256);
std::cout << "*** 3 ***" << std::endl;
} while (g_continue);
std::cout << "*** 4 ***" << std::endl;
WaitForSingleObject (hThread, INFINITE);
CloseHandle (hThread);
return 0;
} // main
Вывод:
C:\vBuild\tst001\Release>tst001.exe
*** 1 ***
*** 2 ***
*** 3 ***
*** 4 ***
C:\vBuild\tst001\Release>
Здравствуйте, McQwerty, Вы писали:
MQ> CloseHandle (GetStdHandle (STD_INPUT_HANDLE));
fclose(stdin)
Всем спасибо за помощь
вот этот вариант помог
CloseHandle (GetStdHandle (STD_INPUT_HANDLE));
а этот
fclose(stdin)
также зависает
видимо один реализован через другой