簡體   English   中英

非阻塞io函數而不是cin.get()

[英]non-blocking io function instead of cin.get()

我有一個c ++控制台應用程序,可以通過按任意鍵(通過使用kbhit()實現)中斷選項,在這種情況下,它打印它已完成和退出(或可以留下完成工作(一些錄制)並仍然打印反饋)。 我正在為該控制台應用程序制作ac#gui應用程序(我從c#表單調用exe文件)而不是按鍵盤上的任何鍵,我使用“停止”按鈕發送Environment.NewLine(或“\\ n “)對於重定向的輸入和c ++應用程序,我現在必須使用與kbhit()不同的東西才能工作。 我嘗試使用cin.get(),如:

if (kbhit() || (cin.get() > 0))  
    stop_recording=true;  

但是cin.get()是一個阻塞函數,如果我希望控制台應用程序運行到最后,它不會在沒有按下停止按鈕的情況下關閉。 是否有任何類似於cin.get()的函數實際上沒有阻塞,或者可能是一種不同的方式將“任何鍵”從c#發送到我的控制台應用程序進程?

使用_getch() cin.get() 它是一個阻塞命令,但只有if ( _kbhit() )它才會立即返回時執行它。

您可以嘗試將Ctrl + C發送到控制台進程以觸​​發其中斷行為。

如果需要繼續,可以檢查命名同步對象 - 即在UI過程中創建名為Mutex / Semaphore(具有隨機名稱)並將此名稱傳遞給控制台進程。 控制台進程會偶爾檢查一次(而不是kbhit),如果它仍然可以獲取Mutex / Semaphore並在它不再可以時停止。

@Komyg建議的另一個選項是專門用於讀取控制台的線程,並檢查特定輸入是否顯示在那里。

如果您期望程序之間的更多通信搜索IPC“進程間通信”以查看更多方法。

這里找到一個非常簡單的答案: C ++中線程的簡單示例 積分歸Edward Kmett所有。
我碰巧在c ++應用程序中使用boost庫,所以我也可以使用boost thread實現。 這很簡單,這就是我的線程函數的樣子:

bool stopped=false;

void inputSent() //
{  
    if (kbhit() || (cin.get() > 0))  
        stopped=true;  

}  

后來在main.cpp中:

boost::thread stoppedThread = boost::thread(inputSent);  

之后我只檢查是否停止== true,我沒有使用stoppedThread.join(我不知道是不是這個錯誤,因為我不知道程序什么時候結束,如果我要離開僵屍線程背后......也許有人可以啟發我這個)。

暫無
暫無

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

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