sendmessage等待返回,使用postmessage试试

解决方案 »

  1.   

    我在操作日志文件,用postmessage的话,很容易把日志写乱的,而日志的顺序又非常重要
      

  2.   

    而且换成postmessage有时也会费时上百毫秒的
      

  3.   

    测试一下
    long bin = clock();
    SendMessage(...);
    long end = clock() - bin;
    end应该为SendMessage所占用的CPU时钟频率
      

  4.   

    我实测过的。执行PostMessage的时间大部分为0毫秒,但常能出现15-16毫秒,偶尔更能上百毫秒dw1 = GetTickCount();
    theApp.m_pMainWnd->PostMessage(WM_SENDINFO, (WPARAM)sData, 0);
    dw2 = GetTickCount();
    耗时=dw2-dw1
      

  5.   

    dw1   =   GetTickCount();
    theApp.m_pMainWnd-> PostMessage(WM_SENDINFO,   (WPARAM)sData,   0);
    dw2   =   GetTickCount();如果其中发生一次线程上下文切换
      

  6.   

    根据记录显示,有一次sendMessage耗时280毫秒,可在SendMessage的响应函数中只执行了16毫秒就返回了,完全搞不清其余时间消费在哪里了.
      

  7.   

    根据记录显示,有一次sendMessage耗时280毫秒,可在SendMessage的响应函数中只执行了16毫秒就返回了,完全搞不清其余时间消费在哪里了.
    =================================================
    很明显是消耗在线程上下文切换,还有其他线程的执行时间上了,参考下面流程:线程调用sendmessage,陷入内核,进行线程上下文切换,该线程阻塞
    内核检查查找sendmessage的目标线程,期望将其调度起来执行
    调度器判断存在比目标线程更需要执行的线程,先将其调度起来执行
    先执行的线程耗尽时间片,调度器选择目标线程执行
    目标线程执行完毕,向内核返回,内核向调用线程返回结果,切换回去,解阻塞
      

  8.   

    可该线程的级别我已经设置到了THREAD_PRIORITY_HIGHEST,而且还有更长的780毫秒
      

  9.   

    stoneyrh 说不时时写日志,我也想啊,但是要求程序始终都在执行,也就是说没有空闲时间,我一个小时可以写5-6M,都放在缓存里,运行2天就不成了。
      

  10.   

    根据记录显示,有一次sendMessage耗时280毫秒,可在SendMessage的响应函数中只执行了16毫秒就返回了,完全搞不清其余时间消费在哪里了. 
    ================================================= 
    很明显是消耗在线程上下文切换,还有其他线程的执行时间上了,参考下面流程: 线程调用sendmessage,陷入内核,进行线程上下文切换,该线程阻塞 
    内核检查查找sendmessage的目标线程,期望将其调度起来执行 
    调度器判断存在比目标线程更需要执行的线程,先将其调度起来执行 
    先执行的线程耗尽时间片,调度器选择目标线程执行 
    目标线程执行完毕,向内核返回,内核向调用线程返回结果,切换回去,解阻塞
    ================================================= 
    时间片也不该那么长,我用postMessage,都有2,3百毫秒返回的,就算再差的计算机,时间片也可能达到10ms啊
      

  11.   

    错了,时间片也不该那么长,我用postMessage,都有2,3百毫秒返回的,就算再差的计算机,时间片也不可能达到10ms啊
      

  12.   

    我单做了个线程,只用sendmessage更新日志,结果发现最长也就16毫秒,看来应该是这个流程里的其他步骤影响了sendmessage的时间,可是结果全都正确,我的程序又怎么会影响到sendmessage那?
      

  13.   

    sendMessage发送的消息,要等到执行返回后才可以继续往下执行,所以消息在消息队列里便等待的时间不同,程序执行时间也就不同了