一、多线程设计
1、线程创建
HANDLE m_hThreadControl;
m_hThreadControl = ::CreateThread(NULL, 0, ThreadControl, (LPVOID)this, 0 ,0);
注:线程函数是回调函数,因此必须是静态函数。
m_hThreadControl用来保存线程句柄。
2、线程函数定义
DWORD WINAPI 类名::ThreadControl(LPVOID lpData)
{
类名 *This = reinterpret_cast<类名 *>(lpData);
}
注:This 是传过来的对象指针,必须经过强制转换才能使用;
WINAPI #define WINAPI__stdcall 定义了函数参数入栈的顺序。
3、线程终止
其中用线程函数的return返回, 而终止线程是最安全的,
在线程函数return返回后, 会清理函数内申请的类对象。
注:不要使用ExitThread()函数,会造成内存泄露。
4、线程数据传输
遇到问题:
在线程外可以正常获取图像指针,但在线程里通过完全相同的
方式却无法正常获取。
解决途径:
可以在将在线程外正常获取的图像指针单独用一个成员变量保存起来,在
线程中直接调用该变量就可以了,不需要再重新去获取。
问题关键:
AfxGetMainWnd()函数获取的是当前线程的窗口指针,如果在主线程里调用,
则返回主线程的窗口指针,如果是在工作线程里调用,则返回工作线程的窗口指针。
这个函数在线程中使用是有问题的,应使用AfxGetApp()->GetMainWnd()。
5、线程互斥
有时候为了线程函数中某些函数的不间断执行,需要用到互斥锁。
比如:
HANDLE hMutex = NULL;
WaitForSingleObj