ect = (CMyObject*)pParam;
if (pObject == NULL ||
!pObject- >IsKindOf(RUNTIME_CLASS(CMyObject)))
return -1; //非法参数
……//具体实现内容
return 0; //线程成功结束
}
//在
程序中调用线程的函数
……
pNewObject = new CMyObject;
AfxBeginThread(MyThreadProc, pNewObject);
……
创建用户界面线程有两种方法。
---- 第一种方法,首先从CWinTread 类派生一个类(注意必须要用宏DECLARE_DYNCREATE 和IMPLEMENT_DYNCREATE 对该类进行声明和实现);然后调用函数AfxBeginThread 创建CWinThread 派生类的对象进行初始化启动线程运行。除了调用函数AfxBeginThread 之外, 也可以采用第二种方法,即先通过构造函数创建类CWinThread 的一个对象,然后由程序员调用函数::CreateThread 来启动线程。通常类CWinThread 的对象在该线程的生存期结束时将自动终止,如果
程序员希望自己来控制,则需要将m_bAutoDelete 设为FALSE。这样在线程终止之后类CWinThread 对象仍然存在,只是在这种情况下需要手动删除CWinThread 对象。
---- 通常线程函数结束之后,线程将自行终止。类CwinThread 将为我们完成结束线程的工作。如果在线程的执行过程中程序员希望强行终止线程的话,则需要在线程内部调用AfxEndThread(nExitCode)。其参数为线程结束码。这样将终止线程的运行,并释放线程所占用的资源。如果从另一个线程来终止该线程,则必须在两个线程之间设置通信方法。如果从线程外部来终止线程的话,还可以使用Win32 函数(CWinThread 类不提供该成员函数):BOOL TerminateThread(HANDLE hThread,DWORD dwExitcode)。但在实际
程序设计中对该函数的使用一定要谨慎,因为一旦该命令发出,将立即终止该线程,并不释放线程所占用的资源,这样可能会引起系统不稳定。
---- 如果所终止的线程是进程内的最后一个线程,则在该线程终止之后进程也相应终止。
---- 3 进程和线程的优先级
问题 ---- 在Windows95 和WindowsNT 操作系统当中,任务是有优先级的,共有32 级,从0 到31,系统按照不同的优先级调度线程的运行。
---- 1) 0-15 级是普通优先级,线程的优先级可以动态变化。高优先级线程优先运行,只有高优先级线程不运行时,才调度低优先级线程运行。优先级相同的线程按照时间片轮流运行。2) 16-30 级是实时优先级,实时优先级与普通优先级的最大区别在于相同优先级进程的运行不按照时间片轮转,而是先运行的线程就先控制CPU,如果它不主动放弃控制,同级或低优先级的线程就无法运行。
---- 一个线程的优先级首先属于一个类,然后是其在该类中的相对位置。线程优先级的计算可以如下式表示:
---- 线程优先级= 进程类基本优先级+ 线程相对优先级
---- 进程类的基本优先级:
IDLE_PROCESS_CLASS
NORMAL_PROCESS_CLASS
HIGH_PROCESS_CLASS
REAL_TIME_PROCESS_CLASS
线程的相对优先级:
THREAD_PRIORITY_IDLE
(最低优先级,仅在系统空闲时执行)
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL (缺省)
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_CRITICAL
(非常高的优先级)
---- 4 线程同步问题
---- 编写多线程应用
程序的最重要的问题就是线程之间的资源同步访问。因为多个线程在共享资源时如果发生访问冲突通常会产生不正确的结果。例如,一个线程正在更新一个结构的内容的同时另一个线程正试图读取同一个结构。结果,我们将无法得知所读取的数据是什么状态:旧数据,新数据,还是二者的混合?
---- MFC 提供了一组同步和同步访问类来解决这个问题,包括:
---- 同步对象:CSyncObject, CSemaphore, CMutex, CcriticalSection 和CEvent ;同步访问对象:CMultiLock 和CSingleLock