Entrada de consola sin bloqueo C++?
Respuestas: realice la consola IO en una secuencia de fondo y proporcione un medio de comunicación entre subprocesos.
Aquí hay un programa de prueba completo (pero simplista) que implementa async io al aplazar el io a un hilo de fondo.
el programa esperará a que ingrese cadenas (finalice con nueva línea) en la consola y luego realice una operación de 10 segundos con esa cadena.
puede ingresar otra cadena mientras la operación está en progreso.
ingrese 'salir' para que el programa se detenga en el próximo ciclo. prueba
#include <iostream>
#include <memory>
#include <string>
#include <future>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <deque>
int main()
{
std::mutex m;
std::condition_variable cv;
std::string new_string;
bool error = false;
auto io_thread = std::thread([&]{
std::string s;
while(!error && std::getline(std::cin, s, '\n'))
{
auto lock = std::unique_lock<std::mutex>(m);
new_string = std::move(s);
if (new_string == "quit") {
error = true;
}
lock.unlock();
cv.notify_all();
}
auto lock = std::unique_lock<std::mutex>(m);
error = true;
lock.unlock();
cv.notify_all();
});
auto current_string = std::string();
for (;;)
{
auto lock = std::unique_lock<std::mutex>(m);
cv.wait(lock, [&] { return error || (current_string != new_string); });
if (error)
{
break;
}
current_string = new_string;
lock.unlock();
// now use the string that arrived from our non-blocking stream
std::cout << "new string: " << current_string;
std::cout.flush();
for (int i = 0 ; i < 10 ; ++i) {
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << " " << i;
std::cout.flush();
}
std::cout << ". done. next?\n";
std::cout.flush();
}
io_thread.join();
return 0;
}
muestra de carrera:
$ ./async.cpp
first
new string: first 0 1las 2t 3
4 5 6 7 8 9. done. next?
new string: last 0 1 2 3 4 5 6 7 8quit 9. done. next?
Podría un hilo de trabajo ordinario de la biblioteca para usted? – Steinbitglis
@Steinbitglis: ¿Qué es una biblioteca de hilos "ordinarios" y cómo se diferencia de los demás? –
@Tomalak Creo que se refería a una biblioteca de hilos, una biblioteca IO no bloqueante. –