这是本人今天写的一个关于主线程和子线程交换消息的具体实例。
不仅可以直接运行,也写上了较为详细的注解,希望这对你们有帮助。
注意:线程可以用CreatThread来创建,也可以用更为安全的_beginthreadex创建
在这里的C++只是用于文字输出,如果你习惯于使用C++,也能用C++11标准所支持thread来创建线程。
本文多个实例皆用CreatThread来演示消息传递,但实际使用还请使用_beginthreadex或C++的thread。
主要函数如下:(消息传递需要)
使用GetMessage来获取消息
使用PostThreadMessage来发送线程间消息
使用GetCurrentThreadId来获得当前线程ID
次要函数如下:
使用CreateThread创建线程
使用WaitForSingleObject等待单个线程退出
使用CloseHandle关闭线程句柄
因为WM_USER后面的数可以用来自定义消息,所以本次我就使用了
#define WM_MyMessage (WM_USER+一个数字)
这种形式创建了自己的消息
那么言尽于此,正文开始:
为了循序渐进,我们先来看看单向消息传递的简单例子。
主线程发送消息给子线程的例子如下:
#include
#include
using namespace std;
#define WM_DELOK (WM_USER+2)//自定义了一个消息
DWORD WINAPI ThreadProc1(LPVOID lpRarameter) {//线程函数
MSG msg;//准备接受消息
cout << "Thread:I maybe die" << endl;//表示创建好了
while (GetMessage(&msg, NULL, 0, 0)) {//开始等待消息
if (msg.message == WM_DELOK) {//如果收到WM_DELOK消息
cout << "Thread:OK,I die now" << endl;//回复
return 0;//退出
}
Sleep(20);//等待一会
}
cout << "Thread:Well,I cannot die..." << endl;//这里被执行到大概是不可能的
return 0;
}
int main() {
HANDLE th1;//准备创建线程
th1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);//创建线程
Sleep(1000);//稍等一会
cout << "Main:Yes, you will die" << endl;
PostThreadMessage(GetThreadId(th1), WM_DELOK, 0, 0);//给线程发送消息
WaitForSingleObject(th1, INFINITE);//等待线程自然退出
cout << "Thread is die" << endl;//表示线程成功退出
CloseHandle(th1);//关闭句柄
return 0;
}
感觉良好,然后是子线程发送消息给主线程的例子:
#include
#include
using namespace std;
#define WM_DELTH (WM_USER+1)//自定义个消息
DWORD WINAPI ThreadProc1(LPVOID lpRarameter) {
cout << "Thread:I die" << endl;
PostThreadMessage((*(DWORD*)(lpRarameter)), WM_DELTH, 0, 0);//向主窗口发送自毁消息
return 0;
}
int main() {
HANDLE th1;//准备创建线程
MSG msg;//准备接受消息
DWORD mainth = GetCurrentThreadId();//使得子线程知道要把消息传到哪里
th1 = CreateThread(NULL, 0, ThreadProc1, &mainth, 0, NULL);//创建线程,并传递mainth
while (GetMessage(&msg, NULL, 0, 0)) {//等待消息
if (msg.message == WM_DELTH) {//获得消息
cout << "Main:Oh, I get it." << endl;
break;
}
Sleep(20);
}
WaitForSingleObject(th1, INFINITE);//等待线程退出
cout << "Thread is die" << endl;
CloseHandle(th1);//关闭句柄
return 0;
}
最后是本文的核心,综合上面两个小例子后,得到的复杂点(其实不复杂)的相互多次交换消息例子如下:
#include
#include
using namespace std;
//先自定义三个消息
#define WM_DELTH (WM_USER+1)//线程用这个告知主线程他需要被销毁了
#define WM_DELOK (WM_USER+2)//主线程回复子线程可以被销毁了
#define WM_DELTH_GET (WM_USER+3)//子线程回复主线程它已经销毁
DWORD WINAPI ThreadProc1(LPVOID lpRarameter) {//线程函数
MSG msg;//准备接收消息
DWORD th1 = (DWORD)GetCurrentThreadId();//得到当前线程ID
cout << "Thread:I want to die" << endl;
PostThreadMessage((*(DWORD*)(lpRarameter)), WM_DELTH, 0, 0);//向主窗口发送想要自毁消息
while (GetMessage(&msg, NULL,0,0)) {//等待消息
if (msg.message == WM_DELOK) {//收到允许自毁的消息
cout << "Thread:OK,I get it" << endl;
PostThreadMessage((*(DWORD*)(lpRarameter)), WM_DELTH_GET, 0, 0);//向主窗口发送WM_DELTH_GET表示收到消息
return 0;
}
Sleep(20);
}
cout << "Thread:But I cannot die..." << endl;//真的不会执行到这里
return 0;
}
int main() {
HANDLE th1;//准备创建线程
MSG msg;//准备接受消息
DWORD mainth = GetCurrentThreadId();//使得子线程知道要把消息传到哪里
th1 = CreateThread(NULL, 0, ThreadProc1, &mainth, 0, NULL);//创建线程并传递mainth
while (GetMessage(&msg, NULL, 0, 0)) {//等待消息
if (msg.message == WM_DELTH) {//收到WM_DELTH消息
cout << "Main:I give you die" << endl;
PostThreadMessage(GetThreadId(th1), WM_DELOK, 0, 0);//收到并回复消息
}
else if (msg.message == WM_DELTH_GET) {//收到并退出消息循环
cout << "Main:Bye" << endl;
break;
}
Sleep(20);
}
WaitForSingleObject(th1, INFINITE);//等待线程退出
cout << "Thread is die" << endl;
CloseHandle(th1);//关闭句柄
return 0;
}
好的,基本例子到此完毕,相信注解已经帮助大家理解的不错了,要不再看一遍?
好,本文就到此告一段落了,感谢各位的耐心浏览√