当前位置: 首页 > 知识库问答 >
问题:

在windows上阻止stdin时退出应用程序

谭勇
2023-03-14

我有一个应用程序,它在一个线程中使用getline()从标准输入中读取数据。我想从主线程关闭应用程序,而getline仍然阻止另一个线程。如何做到这一点?

我不想强迫用户必须按ctrl-Z来关闭stdin和应用程序。

    null
    null
    null

显示问题的示例代码:

#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;
}

共有1个答案

罗祺
2023-03-14

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, line, '\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;
}
 类似资料:
  • 问题内容: 我正在使用背景音乐创建游戏应用程序。我使用Android Service播放背景音乐是​​因为我想在更改活动时运行BGM。我的问题是,我在每个活动的onPause方法中都声明了finish()(我不想让用户返回并想杀死该活动)。 因此,当我打算进行其他活动时,它将调用onDestroy并停止该服务。我想停止该服务以完全退出应用程序(按下主页按钮),并想要通过onPause()中的BGM

  • 问题内容: 我有两个线程:主线程和从主线程生成的线程。 当主线程退出时,整个程序会终止吗? 问题答案: 没有。 当所有非守护程序线程完成时,Java程序终止。 该文档指出: Java虚拟机启动时,通常只有一个非守护程序线程(通常调用某些指定类的名为main的方法)。Java虚拟机将继续执行线程,直到发生以下任何一种情况: 类的方法已被调用,安全管理器已允许进行退出操作。 不是守护程序线程的所有线程

  • 所以我有安装了Qt addin的Visual Studio 2013(社区版),Qt5库(32位),我试图创建一个独立于所有开发配置的可执行文件(它可能使用静态或共享库,我现在真的不在乎)。 操作系统:Windows7,x64。 为此,我将visual studio选项从更改为,并在

  • 问题内容: 我们发现,由内部证书签署的Swift应用程序无法在iOS9上运行,而在iOS8上却可以正常运行。我们信任开发人员的设置->常规->个人资料,但是当我们尝试启动该应用程序时,它会卡在启动屏幕上,然后退出。 我们从日志中没有任何线索。它仅表明它在20.00秒后无法启动。 我怀疑这是与签名有关的问题。因为当我使用AdHoc证书对应用程序签名时,它在iOS9上运行时没有问题。 没人知道发生了什

  • 问题内容: 在我的Jenkins工作中,我想使用Grunt构建一个JavaScript应用程序。Jenkins构建脚本创建一个构建目录(如果尚不存在),更改到该目录并运行: (当然是全局安装的。)在构建作业时,第一条语句导致Grunt和依赖项按预期的方式下拉。但是,该作业然后成功终止: 第二个不运行。知道为什么脚本在运行后终止而不是继续执行后续语句吗? 问题答案: 因此,事实证明这是一个批处理文件

  • 问题内容: 最近,我将计算机更新为功能更强大的计算机,并配备了四核超线程处理器(i7),因此可以使用大量实际并发。现在,我退出()正在开发的应用程序(带有Swing GUI)时, 偶尔会 遇到以下错误: 好吧,鉴于它开始使用具有更多并发能力的硬件发生,并且与线程有关,并且偶尔发生,这显然是某种时机。但是问题是堆栈跟踪太短了。我只有上面的清单。它根本不包含我自己的代码,因此很难猜测该错误在哪里。 有