我16个一样的线程,读不同的串口,有这样的一个配置 
3秒,5秒,10分钟,30分钟 
我要分别在这几个时间点操作(线程1读串口1,线程2读串口2)。 在线程类(继承自CWinThread)里如何实现

解决方案 »

  1.   

    做个配置,记录每个线程的间隔
    在线程的run函数中,取GettickCount去时间,和上次的时间比较,符合条件就做,并记录下这个时间
      

  2.   

    主界面线程中设置不同的Timer,在OnTimer()里对每个不同Timer响应时,设置不同的标记量(CEvent或bool都可以),然后在每个线程中WaitForSingleObject或Check与本线程相关的变量,等到之后,就做事情,不知道行不? OnTimer(uTimer) 

       m_evTest[uTimer].SetEvent(); 
    } UINT ThreadTest(LPVOID lParam) 

         
        WaitForSingleObject(g_pThis->m_evTest[uTimer]->m_hObject, INFINITE);   // uTimer是每个线程本身 的ID号,可以与timer相同     //  Do something here.......... 
      

  3.   

    1、集中控制:在主界面里面设置一个时钟,该时钟间隔为这些线程周期的最大公约数。在里面设置一个静态计数变量,每触发一次就以该变量为参数依次调用这些线程,线程内部作判断是否工作还是继续等待;(或者用内核对象来通知);2、重载CWinThread,启动时同时启动一个自定义的计时循环,然后由自己管理:
    class CMyThread : public CWinThread
    {
    protected:
        static DWORD WINAPI ThreadTimer(LPVOID lpVoid);
    public:
        int m_nElap; // 间隔时间
        volatile bool m_bRun; // 控制是否继续运行
        void Start(int nElap);
    }DWORD WINAPI CMyThread::ThreadTimer(LPVOID lpVoid)
    {
        CMyThread *pThread = (CMyThread*)lpVoid;
        while( pThread->m_bRun )
        {
            Sleep(pThread->m_nElap);
            pThread->GoWork();
        }
    }void CMyThread::Start(int nElap)
    {
        m_nElap = nElap;
        m_bRun = true;
        CreateThread(NULL, NULL, this, ....);
    }
      

  4.   

    晕死:CreateThread(NULL, NULL, ThreadTimer, this, ....);