严格说来,DLL中不应该有自己的消息循环,所以不提倡在DLL中创建窗口。
是否可以采取以下办法: 计时器用线程来取代?我就有这样的例子和控件。

解决方案 »

  1.   

    谢谢各位!to lin: 创建线程之后呢?如何能产生周期性的消息呢?如果有例子我想看看,控件就不必了。
      

  2.   

    to Nicrosoft:
    后台线程()
    {
     while(not_quit)
     {
     得到当前时间t1;
     处理。
     得到当前时间t2;
     发消息给主窗口,,,
     Sleep(period - (t2-t1) );
     }
    }
    伪语言的说明
      

  3.   

    To Lin:
    Win32系统的DLL是在单独的进程空间中运行的,即使你不使用系统也会有默认得消息循环验证,比如Dll被Load和Release时系统都要产生相应的消息。有很多软件的某些界面模块就是封装到Dll中的,Windows系统的几个核心Dll就在维护着系统的很多隐藏窗口和一个很大的消息循环。
    另外,使用线程将大大占用CPU的处理时间,Sleep是Win16的方法,时间精度只能达到55毫秒,在Win32系统下只是兼容使用,而且会堵塞整个调用后台线程的消息循环。
      

  4.   

    to orbit:
    1. 你说是线程销耗的CPU 时间多还是消息循环耗的时间多?2.Settimer精度会比Sleep()还高?不喜欢可以用TimeEvent3.该线程在后台,怎么会影响主线程运行?4.Dll的消息线程是可以封掉了(不让系统通知消息)5.如果精度实在要求很高,建议使用timeSetEvent()(1ms左右)
      

  5.   

    受orbit的启发,我看是否可以在dll中作如下的处理:
    while(1)
    {
    ...
    if(WaitForSingleObject(OBJECT_CONTROLED, ANY_TIME_YOU_WANT) == WAIT_TIMEOUT)
    {
      //SendSomeMessageHere
      continue;
    }
    else
      break;
    ...
    }
    其中,OBJECT_CONTROLED可以是外部控制的一个CEvent或其他任何好用的东东。
      

  6.   

    呵呵,小弟的问题解决了。其实使用SetTimer就可以了,窗口句柄设为NULL,并给出“TimerProc”函数指针就行了(一开始怎么会没想到呢?)还是感谢各位,小弟给分了。