大佬教程收集整理的这篇文章主要介绍了在stdin阻塞Windows时退出应用程序,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我不想强迫用户必须按ctrl-Z来关闭stdin和应用程序.
到目前为止,我已尝试使用Windows 8.1 64bit,v120平台工具集上的编译器设置(RuntimeLibrary = / MT):
> freopen stdin,但它被内部锁定阻止
>破坏线程,调用abort()
>将一个Eof,line end结束到std :: cin,它也被阻止了
*更新*
> detach()不起作用,exit()被锁定阻止
> winapi TerminatThread()调用abort()
> winapi CloseHandle(GetStdHandle(STD_INPUT_HANDLE))挂起
>调用TerminateProcess() – 有效,但我想优雅地退出
*更新2:解决方案*
> WriteConsoleinput()可以使std :: getline()从阻塞读取返回.这适用于任何msvc运行时库.对于工作解决方案的代码,请参见已接受
#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; }
#include <Windows.h> #include <iostream> #include <thread> #include <String> #include <chrono> #include <atomic> int main(int argc,char *argv[]) { std::atomic_bool stop; stop = false; std::thread t([&]{ std::string line; while (!stop.load() && std::getline(std::cin,'\n')) { std::cout << line; } }); std::this_thread::sleep_for(std::chrono::seconds(1)); stop = true; DWORD dwTmp; INPUT_RECORD ir[2]; ir[0].EventType = KEY_EVENT; ir[0].Event.KeyEvent.bKeyDown = TRUE; ir[0].Event.KeyEvent.dwControlKeyState = 0; ir[0].Event.KeyEvent.uChar.UnicodeChar = VK_RETURN; ir[0].Event.KeyEvent.wRepeatCount = 1; ir[0].Event.KeyEvent.wVirtualKeyCode = VK_RETURN; ir[0].Event.KeyEvent.wVirtualScanCode = MapVirtualKey(VK_RETURN,MAPVK_VK_TO_VSC); ir[1] = ir[0]; ir[1].Event.KeyEvent.bKeyDown = falSE; WriteConsoleInput(GetStdHandle(STD_INPUT_HANDLE),ir,2,&dwTmp); t.join(); return 0; }
以上是大佬教程为你收集整理的在stdin阻塞Windows时退出应用程序全部内容,希望文章能够帮你解决在stdin阻塞Windows时退出应用程序所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。