我用SetTimer做了一个定时器,听别人说这样已经新建了一个线程来,然后想要在一定时候用这个定时器挂起主程序的线程,并且timer的线程继续运行,然后再到一定的条件下恢复这个主线程,用SuspendThread和ReseumThread可以实现吧?还有用SuspendThread需要线程的句柄,请问主程序线程的句柄是什么?怎么获得啊?多谢各位解答!!

解决方案 »

  1.   

    你被人“忽悠”了,定时器不会另开线程,定时器的回调函数是在调用SetTimer的线程里面执行的,如果不信你可以去查MSDN或者做程序验证一下。
      

  2.   

    我也不太懂,不过觉得好像lz需求的逻辑有问题,定时器的作用是post WM_TIMER消息,如果挂起了主线程,谁处理WM_TIMER消息??
    “我用SetTimer做了一个定时器,听别人说这样已经新建了一个线程来”,我不知道这话对不对,我觉得即使是已经新建了一个线程,这也不是你能控制的一般的线程??
      

  3.   

    SetTimer不会新建一个线程,只会定时发送WM_TIMER消息,最后还是你调用SetTimer的那个线程来处理WM_TIMER消息并调用回调函数。
      

  4.   

    SuspendThread //线程挂起
    ResumeThread  //恢复运行
      

  5.   

    你用AfxBeginThread就可以创建线程了。
    具体使用方式看这个函数的说明。可以创建函数线程和类线程。
    我这里只有类线程的例子:
    m_pDGPSThread=(CDGPSThread*)AfxBeginThread(RUNTIME_CLASS(CDGPSThread),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
    m_pDGPSThread->ResumeThread();
    一般在线程类中帮定一个对话框,用于进行消息循环。#if !defined(AFX_DGPSTHREAD_H__A3642D5F_782A_4875_A806_269144078E76__INCLUDED_)
    #define AFX_DGPSTHREAD_H__A3642D5F_782A_4875_A806_269144078E76__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // DGPSThread.h : header file
    //
    #include "DGPSDlg.h"
    /////////////////////////////////////////////////////////////////////////////
    // CDGPSThread threadclass CDGPSThread : public CWinThread
    {
    DECLARE_DYNCREATE(CDGPSThread)
    protected:
    CDGPSThread();           // protected constructor used by dynamic creation// Attributes
    public:
    CDGPSDlg* m_pDlg;// Operations
    public:// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CDGPSThread)
    public:
    virtual BOOL InitInstance();
    virtual int ExitInstance();
    //}}AFX_VIRTUAL// Implementation
    protected:
    virtual ~CDGPSThread(); // Generated message map functions
    //{{AFX_MSG(CDGPSThread)
    // NOTE - the ClassWizard will add and remove member functions here.
    //}}AFX_MSG DECLARE_MESSAGE_MAP()
    };///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_DGPSTHREAD_H__A3642D5F_782A_4875_A806_269144078E76__INCLUDED_)
      

  6.   

    如果是函数的话,你定义一个全局函数,然后作为AfxBeginThread的参数。
      

  7.   

    OpenThread
    获取线程句柄但要求你有该线程的ID
      

  8.   

    现在又遇到一个问题。我这样做的:
    原来的方案:用一个按钮,点击响应函数A,
    现在改进的方案:点击按钮,响应函数B,B创建一个线程,线程里激发函数C,C中包含原函数A的所有内容。
    但是一运行就出错,因为C不是静态的函数?怎么办。
      

  9.   

    其实我是想这样。我定义了两个函数SETTIMER定时器和B;这两个函数都在同一个对话框类里面,其中B函数正常运行的话要很长很长时间,请问怎么通过SETTIMER定时器去终止B函数的运行。在B函数中用RETURN可以把B函数终止掉,我的意思就是如何在SETTIMER定时器中执行B函数功能。谢谢!
      

  10.   

    主線程運行b的時候是不會處理WM_TIMERR消息的