欢迎大家来谈谈在使用多线程时所遇到一些的问题和经验,以相互长进!

解决方案 »

  1.   

    1. 线程的启动  创建一个用户界面线程,首先要从类CwinThread产生一个派生类,同时必须使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE来声明和实现这个CwinThread派生类。  第二步是根据需要重载该派生类的一些成员函数如:ExitInstance();InitInstance();OnIdle();PreTranslateMessage()等函数,最后启动该用户界面线程,调用AfxBeginThread()函数的一个版本:CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );其中第一个参数为指向定义的用户界面线程类指针变量,第二个参数为线程的优先级,第三个参数为线程所对应的堆栈大小,第四个参数为线程创建时的附加标志,缺省为正常状态,如为CREATE_SUSPENDED则线程启动后为挂起状态。  对于工作线程来说,启动一个线程,首先需要编写一个希望与应用程序的其余部分并行运行的函数如Fun1(),接着定义一个指向CwinThread对象的指针变量*pThread,调用AfxBeginThread(Fun1,param,priority)函数,返回值付给pThread变量的同时一并启动该线程来执行上面的Fun1()函数,其中Fun1是线程要运行的函数的名字,也既是上面所说的控制函数的名字,param是准备传送给线程函数Fun1的任意32位值,priority则是定义该线程的优先级别,它是预定义的常数,读者可参考MSDN。  2.线程的优先级  以下的CwinThread类的成员函数用于线程优先级的操作:int GetThreadPriority();
    BOOL SetThradPriority()(int nPriority); 上述的二个函数分别用来获取和设置线程的优先级,这里的优先级,是相对于该线程所处的优先权层次而言的,处于同一优先权层次的线程,优先级高的线程先运行;处于不同优先权层次上的线程,谁的优先权层次高,谁先运行。至于优先级设置所需的常数,自己参考MSDN就可以了,要注意的是要想设置线程的优先级,这个线程在创建时必须具有THREAD_SET_INFORMATION访问权限。对于线程的优先权层次的设置,CwinThread类没有提供相应的函数,但是可以通过Win32 SDK函数GetPriorityClass()和SetPriorityClass()来实现。  3.线程的悬挂、恢复  CwinThread类中包含了应用程序悬挂和恢复它所创建的线程的函数,其中SuspendThread()用来悬挂线程,暂停线程的执行;ResumeThread()用来恢复线程的执行。如果你对一个线程连续若干次执行SuspendThread(),则需要连续执行相应次的ResumeThread()来恢复线程的运行。  4.结束线程  终止线程有三种途径,线程可以在自身内部调用AfxEndThread()来终止自身的运行;可以在线程的外部调用BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode )来强行终止一个线程的运行,然后调用CloseHandle()函数释放线程所占用的堆栈;第三种方法是改变全局变量,使线程的执行函数返回,则该线程终止。下面以第三种方法为例,给出部分代码:////////////////////////////////////////////////////////////////
    //////CtestView message handlers
    /////Set to True to end thread
    Bool bend=FALSE;//定义的全局变量,用于控制线程的运行
    //The Thread Function
    UINT ThreadFunction(LPVOID pParam)//线程函数
    {
    while(!bend)
    {Beep(100,100);
    Sleep(1000);
    }
    return 0;
    }
    CwinThread *pThread;
    HWND hWnd;
    /////////////////////////////////////////////////////////////
    Void CtestView::OninitialUpdate()

    hWnd=GetSafeHwnd();
    pThread=AfxBeginThread(ThradFunction,hWnd);//启动线程
    pThread->m_bAutoDelete=FALSE;//线程为手动删除
    Cview::OnInitialUpdate();
    }
    ////////////////////////////////////////////////////////////////
    Void CtestView::OnDestroy()
    { bend=TRUE;//改变变量,线程结束
    WaitForSingleObject(pThread->m_hThread,INFINITE);//等待线程结束
    delete pThread;//删除线程
    Cview::OnDestroy();