: 感激不尽,程式码如下:
: 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
这个时间,对于已知的反应来说,很够了
以上总归为 时序、时机
如果希望效果是 或 类似并列运行,会常常遇到相关问题