Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Потоки и ввод с клавиатуры


Автор: enzaime 11.5.2014, 12:07
Всем привет, у меня вот какая проблема:
не получается во время выполнения потока выполнить ввод с клавиатуры, так как поток автоматически останавливается. (Если убрать оператор cin, то всё поток будет выполняться). Может то что я делаю глупо, но это учебная задача (точнее часть задачи сама задача сделать игру крестики - нолики (потоками))
Код

#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
void func()
{
    int a = 0;
    while (true)
    {
        printf("input start\n");
        cin >> a;
        printf("value %d\n", a);
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    int id1 = 0;
    HANDLE hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, NULL, 1, (LPDWORD)&id1);
    getchar();
    return 0;
}

Автор: Cheloveck 11.5.2014, 12:17
Ты не можешь читать из стандартного ввода сразу в двух потоках, он блокиркется. В твоём случае начинает выполняться функция getchar, после чего программа завершается. 
Основной поток придётся блокировать как-то по-другому, если тебе надо чтиать с консоли в дочернем потоке, например мьютексом.

Автор: enzaime 11.5.2014, 14:28
так если убрать getchar() ничего не работает, даже printf("input start\n"); не срабатывает. Я специально пример до предела упростил, но даже здесь нихера не ясно. Вроде бы понятно, что поток hThread1 блокируется вводным потоком cin (scanf), так как cin вложен в hThread1, то они оба завершаются так и не отработав, но как сделать правильно я не понимаю.

Автор: Cheloveck 12.5.2014, 00:53
Цитата(enzaime @  11.5.2014,  13:07 Найти цитируемый пост)
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, NULL, 1, (LPDWORD)&id1);

Я http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx не нашёл, что значит 1 в предпоследнем параметре, там должен быть ноль!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)