[英]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::cin
或scanf()
獲取它們,然后使用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.