簡體   English   中英

c++ 跨平台控制台應用程序,如何接受用戶輸入的運行時命令?

[英]c++ cross-platform console application, how to accept runtime commands from user input?

有沒有辦法在運行時接受控制台應用程序的用戶輸入?

我有一個控制台應用程序在運行時輸出很多信息,我想在運行時更改應用程序的一些參數而不中斷它。 我想知道天氣 cmd window 可以作為輸入源供用戶鍵入某些預定義命令來執行此操作。

例如,如果我鍵入“threshold = 10”,它將更改參數的值。

我用谷歌搜索了很多,但找不到與我的問題相關的任何內容。

最好

編輯:

我知道必須有另一個線程處理輸入命令並發回執行它們。 我想知道這項工作是否有跨平台庫。

想象一下聊天框,用戶可以在 window 的下半部分鍵入命令,應用程序的 output 消息在上半部分。 這可能會改變 output window 的布局,這可能嗎?

編輯:

如果有人仍然對此感興趣,我找到了一個完美的庫來完成這項任務:

跨平台 header 只有 C++14 交互式命令行接口庫(Cisco 風格) https://github.com/daniele77/cli

假設您有一個運行主要命令的 while 循環。 您可以通過檢測按鍵來暫停它,例如GetAsyncKeyState() ,然后允許用戶輸入一些命令作為文本。 您可以使用std::cinscanf()獲取它們,然后使用std::string函數(例如substr find replace )解析它們。 然后你可以使用system(string.c_str()); ,我記得這些調用需要與 const chars 一起使用。 我想它會成功的。 或者,如果您希望控制台靜默運行,可以使用WinExec(string.c_str(),SW_HIDE); . 這已被棄用,但仍然會產生奇跡。 如果你想在運行時改變一個變量的值,你可以在std::map中 map 它,例如通過使用一些map<string,int>你可以在運行時訪問變量。

std::map<std::string,int> mymap;
mymap["playerhealth"]=20;
while(1)
{
    //...
    if(...) break;
}
std::string string;
std::cout<<"Enter command: ";
std::cin>>string;
std::string vartobechanged=string.substr(0,string.find("="));
mymap[vartobechanged]=atoi(string.substr(string.find("=")+1,string.length()-string.find("=")-1).c_str());

希望這能給出一個主意,祝你好運

根據您使用的術語“控制台”,我假設您處於 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, 0, ReadFromStdIn, NULL, 0, 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 然后你可以正確關閉線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM