: 感激不盡,程式碼如下:
: while(1){
: .
: .
: .
: while (1){ //希望可以退出這個迴圈
: for (int q = 30; q < 149; q++)
: {
: cvShowImage("image", Image);
: for (int w = 0; w < 4000; w+)
: {
: FillRectangle(XYZ_New[q][w][0], XYZ_New[q][w][1], XYZ_New[q][w][2]);
: }
: Delay_DoEvents(0.001);
: }
: key = waitKey(1); //有時候抓不到
: printf("%d\n", key);
: if (key == '1')
: {
: Pointx = Pointx + 10;
: break;
: }
: else if (key == '2')
: {
: Pointx = Pointx - 10;
: break;
: }
: }
: }
: 推 suwako: 我自己簡單測試了一下 沒有抓不到的問題阿 03/10 07:52
: 改成waitKey(100)就可以了,可能是鍵盤的沒船那麼那麼快@@
: 感激不盡!
:
有幾個要點,個人覺得你不是弄得很清楚
首先,使用 waitKey() 時候
你希望 flow 繼續跑,不要卡住
因此有人提議使用 waitKey(1)
你用了之後,發現會漏觸發
接著改用 waitKey(100)
發現好像不會漏了
不過依照經驗,其他使用者來使用的話,還是會有機會漏掉
原因是,code 是你寫的,所以你知道
畫完圖後,只有一小段時間來等待 key in
因此你可以做到百發百中
甚至你可以做到預判,因為你知道繪圖何時快結束
有點像紅燈倒數,預先起步的情況
先回到 waitKey(1) 抓不到的問題
經驗來說 keyDown 到 keyUp 大約是 100 ~ 300 ms
但 waitKey(1) 只等待了 1 ms
假設你沒有預判,而確實等繪圖完全結束後,你在按下按鍵
你覺得 你的反應時間能每次都命中那 1 ms
我是每次都會 miss 啦
假設你預判了
有效觸發的條件是,waitKey(1) 剛好落在這次 keyDown - KeyUp 之間
所以你預判加上你每次按下時間是否都會剛好符合條件?
綜合以上,你使用 waitKey(1) 就會時有時無
其實你可以試試看,改回 waitKey(1)
然後在繪圖快結束之前
做 keyDown 而不 KeyUp,你會發現百發百中
因為故意使 按下時間 會涵蓋到 waitKey(1)
而如果在 keyUp 後才跑到 waitKey(100)
那當然也不會觸發
但是為什麼會變成比較容易,甚至百百中呢?
原因是,綜合預判、按下時間、waitKey(100)
整個反應至少會拉到 100~250 ms
這個時間,對於已知的反應來說,很夠了
以上總歸為 時序、時機
如果希望效果是 或 類似並列運行,會常常遇到相關問題