HANDLE
WINAPI
CreateThread (
LPSECURITY_ATTRIBUTES lpsa, // security属性,在WinCE下须为NULL
DWORD cbStack, // 堆栈大小,除非定义宏,否则被忽略
LPTHREAD_START_ROUTINE lpStartAddr, // 起始地址,即C的函数指针
LPVOID lpvThreadParam, // 自定义的传入线程参数
DWORD fdwCreate, // 标识线程是否立即运行,默认是
LPDWORD lpIDThread // 新线程ID
);
线程自身应用return结束,也可使用ExitThread()结束;主线程可以使用WaitForSingleObject(hThreadHandle, dwMilliseconds)等待线程结束,然后使用GetExitCode()获得返回码,最后使用CloseHandle()释放核心对象
CWinThread* AFXAPI AfxBeginThread( // 创建工作者线程重载方法
AFX_THREADPROC pfnThreadProc, // 线程起始函数
LPVOID pParam, // 自定义参数
int nPriority = THREAD_PRIORITY_NORMAL, // 优先级
UINT nStackSize = 0, // 栈大小
DWORD dwCreateFlags = 0, //标识线程是否立即运行,默认是
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL // 安全属性
);
CWinThread* AFXAPI AfxBeginThread( // 创建UI线程
CRuntimeClass* pThreadClass, //指定线程类,为CWinThread子类
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
CWinThread *pSubQuerySampleThread = AfxBeginThread(SubThread,(LPVOID)this,0,0,0,0);
pSubThread->SetThreadPriority(THREAD_PRIORITY_ABOVE_NORMAL); 
HANDLE hCloseEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
if (INVALID_HANDLE_VALUE == hCloseEvent) {... ...}
SetEvent(hCloseEvent);
… …
ResetEvent(hCloseEvent);
BOOL bInitiallyOwn = FALSE, // 标识初始时是否有信号
BOOL bManualReset = FALSE, // 标识是否为手动置位
LPCTSTR lpszNAme = NULL, // 在进程间同步是可以指定名字
LPSECURITY_ATTRIBUTES lpsaAttribute = NULL // 安全标识
CSyncObject* ppObjects[], // 同步对象数组
DWORD dwCount, // 同步对象个数
BOOL bInitialLock = FALSE // 标识初始时是否访问对象
// 自定义一个用于线程同步的类EventLock,并声明一些CEvent静态成员:
#define EVNT_CNT 3
class EventLock
...{
public:
DWORD WaitForEvents();
void SetEvent(int iNum);
void ResetEvent(int iNum);
EventLock();
virtual ~EventLock();
static CEvent *pevnt[EVNT_CNT]; // EVNT_CNT标识事件对象数
private:
static CEvent evntClose, evntBegin, evntPause;
CMultiLock *pLock;
};
// 创建CEvent实例:
CEvent EventLock::evntClose (FALSE,TRUE);
CEvent EventLock::evntBegin (FALSE,TRUE);
CEvent EventLock::evntPause (FALSE);
// 初始化同步对象数组:
CEvent * EventLock::pevnt[]=...{&evntClose,&evntBeginSample,
&evntPauseSample, &evntPreSample};
// 在构造器中创建CMultiLock实例:
EventLock::EventLock()
...{
pLock = new CMultiLock((CSyncObject **)EventLock::pevnt,EVNT_CNT);
}
EventLock::~EventLock()
...{
delete pLock;
}
// 与Event相同的MFC CEvent置位、复位操作:
void EventLock::ResetEvent( int iNum )
...{
ASSERT(0<=iNum && iNum<EVNT_CNT);
pevnt[iNum]->ResetEvent();
}
void EventLock::SetEvent(int iNum)
...{
ASSERT(0<=iNum && iNum<EVNT_CNT);
pevnt[iNum]->SetEvent();
}
// 使用CMultiLock::Lock()等待事件激发,此处为等待任意事件激发:
DWORD EventLock::WaitForEvents()
...{
DWORD dwEvent = 0;
dwEvent = pLock->Lock(INFINITE, FALSE); // 第二个参数为TRUE则等待全部事件
dwEvent -= WAIT_OBJECT_0;
return dwEvent;
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13771794/viewspace-524924/ ,如需转载,请注明出处,否则将追究法律责任。