2010-10-15 81 views
10

我正在使用C(gcc)和ncurses來創建一個程序來監視來自串口的數據。該方案具有很大的while,它讀取來自端口,並在同一時間傳來的數據,它打印在屏幕信息...如何從鍵盤獲得輸入,同時做其他事情?

但問題就在這裏:

它怎麼能看從我的鍵盤輸入,(因爲getch()凍結程序,直到它獲得輸入)並同時讀取來自端口的信息?

也許我必須用另一種方式(不是大的while),所以想法是歡迎的!

+0

對於這個問題,您可能需要調查線程:http://en.wikipedia.org/wiki/Thread_(computer_science) – sje397 2010-10-15 06:18:45

+3

或'select()'。 – 2010-10-15 06:27:36

回答

8

make getch使用nodelay選項的非阻塞呼叫。

nodelay(stdscr,TRUE); 

更多信息,可以在http://www.gsp.com/cgi-bin/man.cgi?topic=nodelay

+0

正是我在找的東西!謝謝!! – Tomas 2010-10-15 06:42:01

+2

http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/你可以從這裏學到很多東西。 – Rozuur 2010-10-15 06:44:02

+2

該鏈接實際上沒有提及'nodelay()' – Wutaz 2014-04-28 19:10:17

0

根據您的環境中找到你也許有功能的kbhit(),它只是峯值出現在鍵盤緩衝區,並返回非零,如果有一個關鍵的有 - 那麼你可以做getch()。

(conio.h)

0

也許fork()?只要記住,孩子在一個單獨的進程運行,因此變量不能直接它們之間共享

pid_t pID = fork(); 
if (pID == 0) {    // child 
    // Code executed only by child process 
    // getch() ... 
} else if (pID < 0) {   // failed to fork 
    // Throw exception 
    // ... 
} else {      // parent 
    // Code executed only by parent process 
    // ... 
} 
+0

是的,我知道這可能會導致頭痛 - 請注意空手。 – belwood 2010-10-15 06:33:59

+1

這是一種優雅的方式......我不知道。但是在使用ncurses時,我認爲nodelay選項更簡單。 – Tomas 2010-10-15 06:40:04

0

嘗試select()poll()。他們都做同樣的事情,但有不同的界面。你給它一個文件描述符列表,它將一直等到這些描述符中的至少一個準備好,然後返回並告訴你哪些可以被讀取(或寫入)而沒有阻塞。查看示例和更多詳細信息的鏈接。

-1

使用cbreak()禁用行緩衝

nodelay(win, TRUE); 

這將讓你非阻塞getch()功能。

+0

這將仍然阻塞,直到按下一個鍵。 – Wutaz 2014-04-28 19:09:28