У меня есть приложение, которое считывает данные со стандартного ввода, используя getline() в потоке. Я хочу закрыть приложение из основного потока, в то время как getline все еще блокирует другой поток. Как это можно достичь?Выход из приложения при блокировке stdin на окнах
Я не хочу, чтобы пользователи вынуждены были нажать ctrl-Z, чтобы закрыть stdin и приложение.
я пытался до сих пор с моими настройками компилятором (библиотека времени исполнения =/MT) на ОС Windows 8.1 64bit, v120 платформа набор инструментов:
- freopen STDIN, но он заблокирован внутренним замком
- разрушающих нить , который вызывает преждевременное прекращение()
- Putback Eof, линия конец STD :: CIN, который также заблокирован
* Update *
- открепление() не работает, выход() блокируется замком
- WinAPI TerminatThread() вызывает прервать()
- WinAPI CloseHandle (GetStdHandle (STD_INPUT_HANDLE)) висит
- призывающую TerminateProcess() - работает, но я хотел бы, чтобы выйти изящно
* Update 2: Решение *
- WriteConsoleInput() может преобразовать std :: getline() из блокировки чтения. Это работает с любым msvc runtime libray. Для кода рабочего решения см. Принятый ответ.
Пример кода, показывающий эту проблему:
#include <iostream>
#include <thread>
#include <string>
#include <chrono>
int main(int argc, char *argv[])
{
bool stop = false;
std::thread *t = new std::thread([&]{
std::string line;
while (!stop && std::getline(std::cin, line, '\n')) {
std::cout << line;
}
});
std::this_thread::sleep_for(std::chrono::seconds(1));
stop = true;
// how to stop thread or make getline to return here?
return 0;
}
[деструктор потока] (http://en.cppreference.com/w/cpp/thread/thread/~thread) вызывает станд :: прекратить, если вы не 'отсоединять()' или 'присоединиться() 'это раньше. – Drop
Есть ли причина, почему вы выполняете динамическое распределение? – CoffeeandCode