高手来帮忙!!高精度模拟键盘事件???? 我用一个外部程序向一个线程发送keydown消息,然后一定条件后发送keyup来模拟一个按键过程。要求时间精度高,10毫秒级别,但是总是不能很准,是不是windows的原因?我已经把优先级设为real_time了。高手们有什么办法?下面是等待过程for( ;; ){if( (m_pDC->GetPixel(i, 449) == 0x0)) {i++;Sleep(1);}else break;} 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以么?好像hook时,整个进程都停了,sendmessage没用。 重载消息泵。设置内核事件,这样用sleep不是很准,用queryperformancecount系列函数。 to leeza:谢谢提示,但我是通过判断某一条件成立与否作为结束,比如屏幕上某一点是否为黑色, 与时间没关系. 我认为是因为两进程之间通信会有一个时间差,20ms左右,外部程序发出消息,接收程序接收时延迟了. 有什么办法保证同步么? 呵呵,怎么可能呐?我现在地程序里面频繁使用线程通讯地东东。一秒钟接收线程要给主线程提交72次刷新事件,主线程每秒钟刷新72次。如果要是用gdi的话,可以达到200多次:)没有出现这种的时间差呀。绝对不要用sleep的说。这个肯定是不准的了。 windows不是实时系统,要准确定时恐怕比较难吧。 呵呵!谢谢leeza(zooi) 兄,我的sleep(1)的作用是把cpu周期还给其它线程啊,不是用于计时。 按照你的方法修改如下:其中AAA为一个我还不清楚的参数,我希望它是QueryPerformanceCounter返回的pc与1单位毫秒的倍数。你的程序中是多少呢?LARGE_INTEGER pc,ppc;m_pTargetWnd->SendMessage(WM_KEYDOWN, VK_SPACE, 0x40200001);if ( !QueryPerformanceCounter(&ppc)) break;for( ;; ){ if ( !QueryPerformanceCounter(&pc)) break; if ( pc.QuadPart - ppc.QuadPart >= sleeptime* AAA ) break; Sleep(1);}m_pTargetWnd->SendMessage(WM_KEYUP, VK_SPACE, 0xc0200001); to leeza(zooi) : mostneed() 说的对,他的cpu周期是还给了其他线程啊,还有,如果要在一个线程中等待30分钟(是必须的),但在这期间还要检测是否有线程消息,并处理线程消息,那怎么实现啊 如果要是一个线程需要等待30分钟,可以用WaitForSingleObject等系列函数,里面设置超时时间,为30分钟,这样就可以在30分钟到了之后系统直接通知你。或者如果你需要在等待的时间里面刷新界面,那就用MsgWaitForMultipleObjects,在消息泵里面加入这个调用,然后分别处理消息和事件。并且计算更新经过的时间。就可以了。不会浪费cpu的资源。如果要是想切换线程,强烈建议不要使用sleep,使用SwitchToThread,这个api可以判断当前是否有需要cpu的线程,即使这个线程的优先级比调用api的线程优先级要低,也可以调用。并且相当于传递了一个0ms的参数的sleep。如果用sleep的话,如果其他线程的优先级比调用api线程的优先级低,则不会切换到其他线程,注:Windows98里面不支持这个api的具体实现关于那个QueryPerformanceCount,还有一个函数需要初始化的时候调用QueryPerformanceFrequence,可以获得系统的时钟频率Windows虽然不是实时系统,但是通过技术手段,可以在10或者以下的ms的时钟频率还是可以的,当然了,需要对精度要求不高的情况下才可以。 ATL自绘按钮实现淡入淡出效果 问题 VC++的MFC中文件的路径问题 有关强制转换问题? 关于线程的疑问 com 初级问题!我快要疯掉了! 有进程ID,怎么取到相应的可执行文件名呢? 如何屏蔽属性页关闭功能 关于类厂的简单问题 MFC中使用MSChart控件生成的exe在别的电脑中打开出错 什么事属性页和属性单? 菜问题!!1 怎样更改CFileDialog的标题? 怎么更改对话框上按钮的标题?
我认为是因为两进程之间通信会有一个时间差,20ms左右,外部程序发出消息,接收程序接收时延迟了. 有什么办法保证同步么?
一秒钟接收线程要给主线程提交72次刷新事件,主线程每秒钟刷新72次。
如果要是用gdi的话,可以达到200多次:)
没有出现这种的时间差呀。
绝对不要用sleep的说。这个肯定是不准的了。
其中AAA为一个我还不清楚的参数,我希望它是QueryPerformanceCounter返回的pc与1单位毫秒的倍数。
你的程序中是多少呢?LARGE_INTEGER pc,ppc;m_pTargetWnd->SendMessage(WM_KEYDOWN, VK_SPACE, 0x40200001);
if ( !QueryPerformanceCounter(&ppc)) break;
for( ;; )
{
if ( !QueryPerformanceCounter(&pc)) break;
if ( pc.QuadPart - ppc.QuadPart >= sleeptime* AAA ) break;
Sleep(1);
}
m_pTargetWnd->SendMessage(WM_KEYUP, VK_SPACE, 0xc0200001);
mostneed() 说的对,他的cpu周期是还给了其他线程啊,还有,如果要在一个线程中等待30分钟(是必须的),但在这期间还要检测是否有线程消息,并处理线程消息,那怎么实现啊
或者如果你需要在等待的时间里面刷新界面,那就用MsgWaitForMultipleObjects,在消息泵里面加入这个调用,然后分别处理消息和事件。并且计算更新经过的时间。就可以了。不会浪费cpu的资源。
如果要是想切换线程,强烈建议不要使用sleep,使用SwitchToThread,这个api可以判断当前是否有需要cpu的线程,即使这个线程的优先级比调用api的线程优先级要低,也可以调用。并且相当于传递了一个0ms的参数的sleep。如果用sleep的话,如果其他线程的优先级比调用api线程的优先级低,则不会切换到其他线程,
注:Windows98里面不支持这个api的具体实现
关于那个QueryPerformanceCount,还有一个函数需要初始化的时候调用
QueryPerformanceFrequence,可以获得系统的时钟频率
Windows虽然不是实时系统,但是通过技术手段,可以在10或者以下的ms的时钟频率还是可以的,当然了,需要对精度要求不高的情况下才可以。