Mam aplikację, która odczytuje dane ze standardowego wejścia za pomocą getline() w wątku. Chcę zamknąć aplikację z głównego wątku, podczas gdy getline nadal blokuje drugi wątek. Jak można to osiągnąć?Zamknij aplikację, gdy blokada wejścia w systemie Windows
Nie chcę zmuszać użytkowników do naciśnięcia klawisza ctrl-Z, aby zamknąć stdin i aplikację.
Próbowałem tak daleko z moich ustawień kompilator (RuntimeLibrary =/MT) w systemie Windows 8.1 64bit, v120 platforma ToolSet:
- freopen stdin, ale jest zablokowany przez blokady wewnętrznej
- złomowaniu wątek , który wywołuje abort()
- putback EOF, end linia do std :: cin, która również zablokowany
* Aktualizacja *
- odłączy() nie działa, exit() blokowane przez blokadę
- winapi TerminatThread() wywołuje abort()
- winapi CloseHandle (GetStdHandle (STD_INPUT_HANDLE)) zawiesza
- wzywającą TerminateProcess() - działa, ale chciałbym zakończyć bezpiecznie
* UPDATE 2: Rozwiązanie *
- Funkcja WriteConsoleInput() może spowodować, że std :: getline() zwróci blokowanie odczytu. Działa to z dowolnym libscem wykonawczym msvc. Aby zapoznać się z kodem roboczego rozwiązania, zobacz zaakceptowaną odpowiedź.
Przykładowy kod pokazujący problem:
#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;
}
[destructor wątku] (http://en.cppreference.com/w/cpp/thread/thread/~thread) wywołuje std :: zakończyć, jeśli nie 'odłączyć()' lub 'przyłączyć() 'to wcześniej. – Drop
Czy istnieje powód, dla którego dokonujesz alokacji dynamicznej? – CoffeeandCode