我想写一个用户界面线程的多线程程序,用一个类继承自CWinThread,有的书上说必须要实例化一个指针,得到AfxBeginThread()返回,但是微软的例子又没有用AfxBeginThread(),到底怎么做啊。CreateThread和AfxBeginThread()之间有什么区别啊??我写的是一个Cdialog的程序,线程只是想一分钟画一个图片,不做其他的什么事情,DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE好象是跟文档有关的,我可不可以不要啊??谢谢了

解决方案 »

  1.   

    DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE
    ======================================
    动态运行时声明和执行, 通常如果你的类的构造和析构是保护成员, 可在类中自动创建(详见dissecting MFC)CreateThread 是创建界面线程, 与AfxBeginThread不同的是, 它等待消息处理, 详见GetMessage 和
    MsgWaitForMultipleObjects
      

  2.   

    我问的是CWinThread::CreateThread和AfxBeginThread(),
    我继承了类,直接实例化一个对象和实例化一个指针得到AfxBeginThread()有什么区别。
      

  3.   

    一般情况下使用AfxBeginThread,如果你想重复利用Thread已经成功创建和结束的线程对象,使用CreateThread方法。
      

  4.   

    我只建立一个,只需要暂停,退出的时候才删除,AfxBeginThread的第一个参数是从CWinThread继承的对象的RUNTIME_CLASS,这个怎么写啊,我写了半天都出错
      

  5.   

    AfxBeginThread( 
    AFX_THREADPROC pfnThreadProc, 
    LPVOID pParam)传入线程函数名字 和 参数就可以了 ,在线程函数中 画完让它自动返回就完了UINT ThreadProc(LPVOID pParam)
    {
       while (!StopFlag)//要结束StopFlag设置为 TRUE 就可以了
    {
    }
    }
      

  6.   

    UINT ThreadProc(LPVOID pParam)
    {
       while (!StopFlag)//要结束StopFlag设置为 TRUE 就可以了
       { 
          sleep(一定时间);
          if(Flag) //暂停时StopFlag设置为 TRUE 就可以了
           continue;
       }
    }
      

  7.   

    绝对不能用sleep,太拖速度了,做的是商业软件,MFC程序,
      

  8.   

    有没有什么方法是比较精确的时间间隔,比如精确到10毫秒之内,有不能占用太多的CPU资源,我原来写的QueryPerformanceCounter如果在线程里面运行,占用太多的时间,ON_WM_TIMER如果CPU忙的话可能会不响应,有点伤脑筋啊
      

  9.   

    class MyThread:public CWinThread
    {
    public:
    MyThread();
    virtual BOOL InitInstance();
    virtual ~MyThread();};方法全部为空
    UINT ThreadFunction( LPVOID pParam )//全局方法
    {
    gamePlay();//调用需要的方法
    Sleep(900);
    PIC_Num++;
    return 1;
    }
    m_Thread = (MyThread*)AfxBeginThread(ThreadFunction,(LPVOID)0,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
    m_Thread->ResumeThread();
    为什么我的ThreadFunction只是在ResumeThread的时候调用了一次啊??
      

  10.   

    CREATE_SUSPENDED 参数是你的线程准备好但是不执行 变为0 就行了
    ResumeThread();//开始执行
      

  11.   

    ResumeThread();//开始执行后只执行了一次就不执行了,怎么回事啊
      

  12.   

    你线程已经退出了,而ResumeThread是针对于当前被挂起(SUSPENDED)的线程进行的,如果不想线程退出,不能让线程返回,使用一个无限循环做控制,如果你不想修改线程代码,可以使用CWinThread::CreateThread再次创建刚才的线程再次使用刚才的线程对象,条件是,别自动释放Thread对象
      

  13.   

    我做一个游戏,线程拿来计时,1秒钟让一个数字加1,再画一部分上去,这个线程该怎么做啊,我用工作线程,我用空的方法,想一秒调用一次
    ON_THREAD_MESSAGE(ON_WM_1,onResponse) ,第一个参数怎么设置,一般设置成什么
      

  14.   

    UINT ThreadFunction( LPVOID pParam )//全局方法
    {
    gamePlay();//调用需要的方法
    Sleep(900);
    PIC_Num++;
    return 1;
    }
    你的线程函数里没有循环 ,执行一遍就return 了 当然就只执行一次
    Sleep(900); 当然拖时间了 都快一秒了 。Sleep可以精确到15ms__________________________________________________________
    我做一个游戏,线程拿来计时,1秒钟让一个数字加1,再画一部分上去,这个线程该怎么做啊,我用工作线程,我用空的方法,想一秒调用一次
    ON_THREAD_MESSAGE(ON_WM_1,onResponse) ,第一个参数怎么设置,一般设置成什么这种定时做事情的 程序 用OnTimer 最好了 开始的时候
    SetTimer(ID_TIMER, 1000, NULL)
    OnTimer
    {
       //
       //要做的事情
       //
    }
    完了 
    KillTimer(ID_TIMER); 就可以了
      

  15.   

    线程做的事情很简单,sleep(900),在等一下,数字加1,SetTimer的实时响应不是很好,如果CPU忙的话,就不会执行了,你的意思就是我的线程方法加while(true)?#define ON_WM_1 (WM_USER + 1)
    BEGIN_MESSAGE_MAP(MyThread,CWinThread) 
      ON_THREAD_MESSAGE(ON_WM_1,onResponse)  
    END_MESSAGE_MAP()  
    void   MyThread::onResponse(WPARAM   wParam,   LPARAM   lParam)   

    while(true)
    {
    gamePlay();
    PIC_Num++;
    }

    }
    这样写了还是只执行一次
      

  16.   

    晕,写错东西了。
    AfxBeginThread(ThreadFunction,(LPVOID)0,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
    ThreadFunction才是执行的,在这个里面写while(true).忙了半天,写错了。结帖,给分。
    ON_THREAD_MESSAGE(ON_WM_1,onResponse)映射线程消息和他的处理函数,这个一般拿来做什么啊