WaitForSingleObject на консоли
От: Sheph http://www.focusmedia.ru
Дата: 07.08.06 13:45
Оценка:
Ситуауия такая, хочу ждать ввода с консоли при помощи WaitForSingleObject:
WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), INFINITE);

В MSDN'е написано, что это работает, а на самом деле это не так =(
У меня ввода нет, а эта функция моментально возвращает управление...
Re: WaitForSingleObject на консоли
От: Danchik Украина  
Дата: 07.08.06 14:30
Оценка:
Здравствуйте, Sheph, Вы писали:

S>Ситуауия такая, хочу ждать ввода с консоли при помощи WaitForSingleObject:

S>
S>WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), INFINITE);
S>

S>В MSDN'е написано, что это работает, а на самом деле это не так =(
S>У меня ввода нет, а эта функция моментально возвращает управление...

Какой Result у функции?
Попробуйте почитать ReadConsoleInput, может действительно что то есть.
Re[2]: WaitForSingleObject на консоли
От: Sheph http://www.focusmedia.ru
Дата: 07.08.06 14:37
Оценка:
Здравствуйте, Danchik, Вы писали:
D>Какой Result у функции?
D>Попробуйте почитать ReadConsoleInput, может действительно что то есть.

Результат WAIT_OBJECT_0. И даже при таком коде:

#include <stdio.h>
#include <windows.h>
int main()
{
    DWORD dw = WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), INFINITE);
    return 0;
}

Программа немедленно завершается =(
Re[3]: WaitForSingleObject на консоли
От: Danchik Украина  
Дата: 07.08.06 14:48
Оценка:
Здравствуйте, Sheph, Вы писали:

S>Здравствуйте, Danchik, Вы писали:

D>>Какой Result у функции?
D>>Попробуйте почитать ReadConsoleInput, может действительно что то есть.

S>Результат WAIT_OBJECT_0. И даже при таком коде:


А что возвращает ReadConsoleInput? Есть что то в буфере?

ReadConsoleInput remarks:

Remarks
If the number of records requested in the nLength parameter exceeds the number of records available in the buffer, the number available is read. The function does not return until at least one input record has been read.

A process can specify a console input buffer handle in one of the wait functions to determine when there is unread console input. When the input buffer is not empty, the state of a console input buffer handle is signaled.

To determine the number of unread input records in a console's input buffer, use the GetNumberOfConsoleInputEvents function. To read input records from a console input buffer without affecting the number of unread records, use the PeekConsoleInput function. To discard all unread records in a console's input buffer, use the FlushConsoleInputBuffer function.

Re[4]: WaitForSingleObject на консоли
От: Sheph http://www.focusmedia.ru
Дата: 07.08.06 15:00
Оценка:
Здравствуйте, Danchik, Вы писали:

D>А что возвращает ReadConsoleInput? Есть что то в буфере?


А, всё понятно, WaitForSingleObject не только символов ждёт, а ввода вообще, если допустим написать так:
int main()
{
    FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
    DWORD dw = WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), INFINITE);
    return 0;
}

И не дёргать мышкой и не нажимать клавиши, то он будет ждать, а если дёрнуть мышку, то происходит немедленный возврат =(

Всё что нужно это мышку вырубить, я вот так сделал:

DWORD dwMode;
GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &dwMode);
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), dwMode & ~ENABLE_MOUSE_INPUT);
FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
DWORD dw = WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), INFINITE);


Всё, вопрос закрыт =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.