采用CreateThread创建多线程程序
在window环境下,Win32 提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作:
1、主要的函数列表:
序号 | 函数名 | 功能 |
1 | CreateThread() | 创建一个新线程 |
2 | ExitThread() | 正常结束一个线程的执行 |
3 | TerminateThead() | 强制终止一个线程的执行 |
4 | ResumeThread() | 重启一个线程 |
5 | SuspendThread() | 挂起一个线程 |
6 | GetExiCodeThread() | 得到一个线程的退出码 |
7 | GetThreadPriority() | 得到一个线程的优先级 |
8 | SetThreadPriority() | 设置一个线程的优先级 |
9 | CloseHandle() | 关闭一个线程的句柄 |
10 | CreateRemoteThread() | 再另一个进程中创建一个新线程 |
11 | PostThreadMessage() | 发送一条消息给指定的线程 |
12 | GetCurrentThread() | 得到当前的线程句柄 |
13 | GetCurrentThreadId() | 得到当前线程的ID |
14 | GetThreadId() | 得到指定线程的ID |
15 | WaitForSingleObject() | 等待单个对象 |
16 | WaitForMultipleObjects() | 等待多个对象 |
2、CreateThread函数原型:
HANDLE WINAPI CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程安全相关的属性,常置为NULL
SIZE_T dwStackSize, //新线程的初始化栈在大小,可设置为0
LPTHREAD_START_ROUTINE lpStartAddress, //被线程执行的回调函数,也称为线程函数
LPVOID lpParameter, //传入线程函数的参数,不需传递参数时为NULL
DWORD dwCreationFlags, //控制线程创建的标志
LPDWORD lpThreadId //传出参数,用于获得线程ID,如果为NULL则不返回线程ID
);
3、线程函数的定义:
线程函数的规范格式定义为
DWORD WINAPI ThreadProc (LPVOID lpParam);//格式不正确将无法调用成功。函数名称没有限制,只要符合命名规则就可以。
简单例子:
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
int tipMsg = (int)lpParameter;
CString strMsg;
strMsg.Format(L"%d", tipMsg);
AfxMessageBox(strMsg);
return 0;
}
void CThreadTestOneDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
DWORD dwThreadID = 0;
HANDLE hThread = CreateThread(NULL,0, ThreadProc,(LPVOID)123,0,&dwThreadID);
CloseHandle(hThread);
}