2012-12-22 79 views
0

我有一個程序即將處理大量的數據。我已經有了一些可以停下來的事情,並且可以繼續停下來。中斷用戶輸入,否則繼續

我希望能夠設置它走一段時間(如進程1000個文件),但逃不脫用戶輸入,例如:

for(int i = 0; i < 1000; i++) { 
    if(checkForUserInput()) { break; } 

    processFile(i); 
    /* 
    * ... 
    * 
    */ 
} 

我知道,你可以提示用戶輸入,並如果它符合某些標準再破...但我希望它默認爲繼續使用,無需用戶輸入運行

我想我可能已經在Java的很久以前做過同樣的事情,並IIRC我結束了使用線程---那會是在這裏作爲PROCEDE井的唯一途徑?或者有沒有辦法像Cntrl-C一樣尋找鍵盤轉義序列,然後以某種方式表現出來?


編輯:如果是有原因的,爲什麼這樣的事情完成沒有線程,我很好奇,想知道是什麼原因,作爲井。

謝謝!

回答

3

用戶輸入根據定義阻塞。所以你需要設定一個時間,在這個時間你決定沒有用戶輸入,打破塊並繼續。沒有線程/中斷,你無法做到這一點。

不同的平臺處理用戶中斷的方式不同。閱讀關於signal的處理。

+0

好吧。據推測,這只是c歷史上的一個決定,對吧?我的意思是,你不能只是檢查'系統'是否有任何輸入給你,採取行動,如果它確實,或繼續如果不是? – DilithiumMatrix

+1

@zhermes這是因爲C/C++是OS不可知的。用戶輸入被處理和管理由OS,以及線程和中斷(儘管螺紋在C++中,其最近除了最後標準化)。 – littleadv

+0

,可以寫在執行asynchronus IO的包裝流,但我不知道這是否是比使用線程馬上清潔。包裝流將不得不與線程一起工作,只是抽象它們的使用。 – Paranaix

0

如前所述,signal()可用於在控制檯類型的應用程序中捕獲CTRL-C。但沒有標準的方式來讀取輸入沒有阻塞。

對於不同平臺有一些不同的解決方案,所有這些解決方案都相當麻煩(當然,一旦擁有了代碼,將其複製到另一個項目並不難)。

正如評論中所提到的,C和C++被設計爲可以在大量不同的機器上運行,並且您對「您必須以這種方式執行此操作」的要求越多,語言越多受限制,以至於無法在特定系統上工作 - 如果終端和計算機之間只有每秒110比特,半雙工(數據只能以一次一個方向)線路會怎麼樣?而你只有一個處理器,運行在1.2MHz ......