线程创建
DWORD WINAPI ThreadProFunc1(void *pParam)
{
while (thread1_is_run)
{
printf("this is thread1\n");
Sleep(1000);
}
return 0;
}
void Cdemo5Dlg::OnBnClickedBtnThread1()
{
// TODO: 在此添加控件通知处理程序代码
if (!thread1_is_run) {
HANDLE hThread;
DWORD dwThreadId;
thread1_is_run = true;
hThread = CreateThread(NULL // 默认安全属性
, NULL // 默认堆栈大小
, ThreadProFunc1 // 线程入口地址
, NULL //传递给线程函数的参数
, 0 // 指定线程立即运行
, &dwThreadId //线程ID号
);
CloseHandle(hThread); //关闭线程句柄,内核引用计数减一
} else {
thread1_is_run = false;
}
if(thread1_is_run)
SetDlgItemText(IDC_BTN_THREAD1, _T("终止"));
else
SetDlgItemText(IDC_BTN_THREAD1, _T("创建线程1"));
SetEvent(hEventThread3);
}
这里我用一个button控件控制线程的创建和终止,ThreadProFunc1为线程的入口函数,注意在线程中最好设置一个休眠时间,不然会一直占用cpu资源,导致程序挂死。
线程同步
DWORD WINAPI ThreadProFunc3(void *pParam)
{
printf("thread3 is running...\n");
while (1)
{
WaitForSingleObject(hEventThread3, INFINITE);//INFINITE,无限等待
if (thread1_is_run)
printf("thread1_is_runing\n");
else
printf("thread1_is_exit\n");
ResetEvent(hEventThread3);
}
CloseHandle(hEventThread3);
return 0;
}
这里我介绍的是Event的方式,我在另一个线程中去监视线程1的使用情况,利用WaitForSingleObject(hEventThread3, INFINITE);无限等待hEventThread3事件,该事件在线程1创建或者是终止时被设置(SetEvent(hEventThread3))
另外,创建一个新的event使用hEventThread3 = CreateEvent(NULL, TRUE, FALSE, NULL);
验证结果请可以去运行demo程序
相关资料包括demo代码请到我<MFC实用技巧>篇最下的网盘链接中下载!