1.程序、进程、线程、多线程概念
程序:计算机指令的集合,以文件的形式存储在磁盘上。不占用运行资源。
进程:程序的运行实例,程序在其自身的地址空间中的一次执行活动。可进行资源申请、调度和独立运行。线程的执行环境。
线程:进程内的一个执行路径,负责执行包含在线程地址空间中的代码。
多线程程序:进程地址空间中有多个线程,其中一个为主线程。所有进程共享进程的地址空间、全局对象等资源。线程之间的切换依靠执行环境的改变。
2.线程的创建(参考《VisualC++2010 开发权威指南》第14章)
//声明控制函数(全局的,不放在类中)
UINT ThreadFunc(LPVOID pPARAM);
//定义控制函数,一般线程函数中只有三句话
UINT ThreadFunc(LPVOID pPARAM)
{
CVideoProcessDlg *ptp = (CVideoProcessDlg*)pPARAM; //指针强制转换;
ptp->ImageProcess(); //调用某个对象中的方法(该方法一般不需要输入参数);
return 0; //return
}
CWinThread* pThread; //在类中声明,可以用于线程的控制,如暂停和唤醒
//创建工作者线程,可以在初始化中创建
pThread = AfxBeginThread(ThreadFunc, //线程函数名
this,//此对象指针
THREAD_PRIORITY_NORMAL,//优先权,一般使用默认模式
0,
CREATE_SUSPENDED, //线程初始状态为暂停
NULL);
pThread->ResumeThread(); //启动线程
pThread->SuspendThread(); //暂停线程
3.线程之间的同步(参考《VC++深入详解》第16章)
HANDLE g_hEvent //在类中声明
g_hEvent = CreateEvent(NULL,//进程默认安全性
TRUE,//人工重置的事件对象
FALSE,//初始处于无信号状态
NULL);//匿名的事件对象
SetEvent(g_hEvent); //设置事件对象为有信号状态
ResetEvent(g_hEvent); //设置事件对象为无信号状态
WaitForSingleObject(g_hEvent, INFINITE); //等待有信号状态的事件,放置在ImageProcess()中
5.注意OnClose()中的回收工作,需要释放资源,确保线程的终止等
void CVideoProcessDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_bQuit = TRUE;//主线程结束信号
SetEvent(m_hEventImageAcquired);//防止线程处于等待状态,让线程能够顺利终止(执行到return)
Sleep(20); //给线程的终止留出时间
CDialogEx::OnClose();
}