我用一个外部程序向一个线程发送keydown消息,然后一定条件后发送keyup来模拟一个按键过程。要求时间精度高,10毫秒级别,但是总是不能很准,是不是windows的原因?我已经把优先级设为real_time了。高手们有什么办法?下面是等待过程for( ;; )
{
if( (m_pDC->GetPixel(i, 449) == 0x0)) 
{
i++;
Sleep(1);
}
else break;
}

解决方案 »

  1.   

    可以么?好像hook时,整个进程都停了,sendmessage没用。
      

  2.   

    重载消息泵。设置内核事件,这样用sleep不是很准,用queryperformancecount系列函数。
      

  3.   

    to leeza:谢谢提示,但我是通过判断某一条件成立与否作为结束,比如屏幕上某一点是否为黑色, 与时间没关系.
       我认为是因为两进程之间通信会有一个时间差,20ms左右,外部程序发出消息,接收程序接收时延迟了. 有什么办法保证同步么?
      

  4.   

    呵呵,怎么可能呐?我现在地程序里面频繁使用线程通讯地东东。
    一秒钟接收线程要给主线程提交72次刷新事件,主线程每秒钟刷新72次。
    如果要是用gdi的话,可以达到200多次:)
    没有出现这种的时间差呀。
    绝对不要用sleep的说。这个肯定是不准的了。
      

  5.   

    windows不是实时系统,要准确定时恐怕比较难吧。
      

  6.   

    呵呵!谢谢leeza(zooi) 兄,我的sleep(1)的作用是把cpu周期还给其它线程啊,不是用于计时。
      

  7.   

    按照你的方法修改如下:
    其中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);
      

  8.   

    to  leeza(zooi) :
         mostneed() 说的对,他的cpu周期是还给了其他线程啊,还有,如果要在一个线程中等待30分钟(是必须的),但在这期间还要检测是否有线程消息,并处理线程消息,那怎么实现啊
      

  9.   

    如果要是一个线程需要等待30分钟,可以用WaitForSingleObject等系列函数,里面设置超时时间,为30分钟,这样就可以在30分钟到了之后系统直接通知你。
    或者如果你需要在等待的时间里面刷新界面,那就用MsgWaitForMultipleObjects,在消息泵里面加入这个调用,然后分别处理消息和事件。并且计算更新经过的时间。就可以了。不会浪费cpu的资源。
    如果要是想切换线程,强烈建议不要使用sleep,使用SwitchToThread,这个api可以判断当前是否有需要cpu的线程,即使这个线程的优先级比调用api的线程优先级要低,也可以调用。并且相当于传递了一个0ms的参数的sleep。如果用sleep的话,如果其他线程的优先级比调用api线程的优先级低,则不会切换到其他线程,
    注:Windows98里面不支持这个api的具体实现
    关于那个QueryPerformanceCount,还有一个函数需要初始化的时候调用
    QueryPerformanceFrequence,可以获得系统的时钟频率
    Windows虽然不是实时系统,但是通过技术手段,可以在10或者以下的ms的时钟频率还是可以的,当然了,需要对精度要求不高的情况下才可以。