unsigned int __stdcall  func(LPVOID lp)
{
SetTimer(NULL,NULL,500,FightBasicFunction);
AfxMessageBox("11");
while(TRUE)
{
Sleep(1000);
}
return 0;
}DLL中这样的一个线程,我在线程中开了一个定时器,如果把AfxMessageBox("11")去掉后,定时器就不起作用了,这是什么原因.

解决方案 »

  1.   

    你的线程根本没消息环,SetTimer有什么用?WM_TIMER谁来收?
      

  2.   

    程序是可以运行,去掉AfxMessageBox("11");后就不能运行了,请问下应该怎么改呢
      

  3.   

    线程如果是基于UI有消息环的可以用SetTimer,否则用timeSetEvent做定时器回调
    参考我的博客文章
    高精度多媒体时钟应用类
      

  4.   

    在FightBasicFunction里你干什么了
      

  5.   

    既然都用到了多线程,何必还再用SetTimer呢直接用一个线程来实现timer嘛!#define TIMER_LEN     10000DWORD WINAPI TimerThread(LPARAM pamaram)
    {
        UINT oldTickCount, newTickCount;
        oldTickCount = GetTickCount();
        while(TRUE)
        {
            while(TRUE)
            {
                newTickCount = GetTickCount();
                if(newTickCount - oldTickCount >= TIMER_LEN)
                {
                    oldTickCount = newTickCount;
                    break;
                }
                else
                    SwitchToThread();
            }
            // Call your function
        }
        return 0;
    }
      

  6.   

    我遇到个问题,就是我在DLL中里有个settimer,定时器里是读内存中的一个二叉树结构体
    void  f(Bitree *root)
    {
           Bitree T;
           ...
           _asm
           {
           ....
           mov T.obj,eax
           ....
           }
           ...
           ...
           f(T.lch);
           f(T.rch);
    }
    我现在想把这个基于窗口的换成无窗口的,我试过开多线程,在线程内部用while(TRUE)+Sleep(500);但是没运行一会儿程序就崩溃了,DLL是MFC下的,AfxBeginThread(),_beginThreadex()等几个创建线程的我都试过,都是这样,如果用settimer就没有错误,请问下是什么原因.