Про std::cin
От: ioni Россия  
Дата: 11.12.08 06:47
Оценка:
Есть поток считывания команд введных с консоли.
Цикл выборки примерно такой
    do 
    {
        ...
        char ch[256] = {0};
        std::cin.getline(ch, 256);
        ....
    } while( ... );

не факт что в консоль будет что то введено, этот канал не является основным канал прихода команд.
При завершении программы по альтернатевному пути, этот поток висит потому что
std::cin
не возвращает
управление. Знает ли кто как вывести
std::cin
из этого состояния? Вызов из другого потока
std::cin >> что нибудь
не помогает.
Возможно есть какие нибудь хаки, интересует windows платформа.
Re: Про std::cin
От: Rocky  
Дата: 11.12.08 08:31
Оценка:
При работе с консолью я пользовал функцию _kbhit, чтобы определить, есть ли что читать. И, соответственно, читать только, если что-то есть.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Про std::cin
От: ioni Россия  
Дата: 11.12.08 09:25
Оценка:
Здравствуйте, Rocky, Вы писали:

R>При работе с консолью я пользовал функцию _kbhit, чтобы определить, есть ли что читать. И, соответственно, читать только, если что-то есть.


Спасибо попробую
Re: Про std::cin
От: McQwerty Россия  
Дата: 11.12.08 10:14
Оценка: 6 (1)
Здравствуйте, 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>

Re[2]: Про std::cin
От: remark Россия http://www.1024cores.net/
Дата: 11.12.08 16:19
Оценка: 2 (2)
Здравствуйте, McQwerty, Вы писали:

MQ> CloseHandle (GetStdHandle (STD_INPUT_HANDLE));


fclose(stdin)




1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Про std::cin
От: ioni Россия  
Дата: 12.12.08 06:14
Оценка:
Всем спасибо за помощь

вот этот вариант помог
 CloseHandle (GetStdHandle (STD_INPUT_HANDLE));


а этот
 fclose(stdin)
также зависает
видимо один реализован через другой
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.