wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在stdin阻塞Windows时退出应用程序大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我有一个应用程序,它使用线程中的getline()从标准输入读取数据.我想从主线程关闭应用程序,而getline仍然阻止其他线程.怎么能实现这一目标? 我不想强迫用户必须按ctrl-Z来关闭stdin和应用程序. 到目前为止,我已尝试使用Windows 8.1 64bit,v120平台工具集上的编译器设置(RuntimeLibrary = / MT): > freopen stdin,但它被内部锁
我有一个应用程序,它使用线程中的getline()从标准输入读取数据.我想从主线程关闭应用程序,而getline仍然阻止其他线程.怎么能实现这一目标?

我不想强迫用户必须按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;
}

解决方法

writeConsoleinput()可以使std :: getline从阻塞读取返回,因此即使使用/ MT编译器选项也可以解决问题.

#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,请注明来意。