c ++跨平台控制台应用程序,如何从用户输入接受运行时命令?

问题描述

是否可以在运行时接受控制台应用程序的用户输入?

我有一个控制台应用程序在运行时会输出很多信息,我想在运行时更改应用程序的某些参数而不会干扰它。我想知道cmd窗口是否可以作为输入源,以便用户键入某些预定义的命令来实现。

例如,如果我输入“ threshold = 10”,它将更改参数的值。

我在Google上搜索了很多,但是找不到与我的问题有关的任何内容

最佳

编辑:

我知道必须有另一个线程处理输入命令并发送回去执行它们。我想知道天气是否有跨平台的库来完成这项工作。

想想一个聊天框,用户可以在窗口的下半部分键入命令,而应用程序的输出消息则在上半部分。这可能会更改输出窗口的布局,可以吗?

解决方法

假设您有一个while循环,其中运行了主要命令。您可以通过检测诸如'#Totals[efg之类的按键来暂停它,然后允许用户以文本形式输入一些命令。您可以使用GetAsyncKeyState()std::cin来获取它们,然后使用scanf()函数来解析它们,例如std::string substr find。然后您可以使用replace,正如我记得的那样,这些调用需要与const char一起使用。我想它将成功。或者,如果您希望控制台以静默方式运行,则可以使用system(string.c_str());。不推荐使用此功能,但仍会产生奇迹。如果要在运行时更改变量的值,可以将其映射到WinExec(string.c_str(),SW_HIDE);内,例如,通过使用某些std::map可以在运行时访问变量。

map<string,int>

希望这能带来一个好主意

,

我假设您所用的Windows环境是“控制台”,因此在这里我将对线程使用Windows特定的构造。

使用 user4581301 的注释作为参考,可以通过将std::getline放入另一个线程的循环中来完成。例如:

#include <windows.h>
#include <iostream>
#include <string>

std::string somevar = "initial value";
HANDLE hMutex = NULL;

DWORD CALLBACK ReadFromStdIn(LPVOID param){
    while (true) {
        std::string line;
        std::getline(std::cin,line);

        WaitForSingleObject(hMutex,INFINITE);
        somevar = line;
        ReleaseMutex(hMutex);
    }
}

int main()
{
    hMutex = CreateMutex(NULL,FALSE,NULL);
    HANDLE hThread = CreateThread(NULL,ReadFromStdIn,NULL,NULL);

    for (int i = 0; i < 1000; ++i) {

        WaitForSingleObject(hMutex,INFINITE);
        std::cout << somevar << " " << i << std::endl;
        ReleaseMutex(hMutex);

        Sleep(1000);
    }

    // TODO: somehow cancel the readline on stdin

    WaitForSingleObject(hThread,INFINITE);
    CloseHandle(hThread);

    WaitForSingleObject(hMutex,INFINITE);
    CloseHandle(hMutex);

    return 0;
}

这是糊涂吗?也许...最大的问题是如何优雅地退出该线程?也许您可以以某种方式打断std::getline?然后您可以正确关闭线程。