2024年3月14日发(作者:)
创建两个线程
threadl
和
thread2
,由
threadl
发消息给
thread2
,消息的内容是一个结构体
Struct A{
Int
Char ..;
}
2
收到消息后要告知
1
以收到,最后
1
要发布消息证明
2
已收到。
思路:
1.
创建线程,要知道
createthread
函数怎么使用(其中还要理解句柄的含义和用途)
;
2.
创建后每个线程要实现各自的功能,可以使用
3
•将结构体作为消息时要注意消息的格式,和
eve nt
控制线程之间的执行过程。
MSG
函数的结构。
具体代码如下:
#i nclude
#in clude
//
变量的定义
HANDLE hthread1;
〃定义全局变量
HANDLE hthread2;
HANDLE hstartevent;
〃 定义事件句柄
unsigned nThreadlD1; //
定义线程
1
和
2
的线程
ID
un sig ned n ThreadID2;
句柄
1
和句柄
1
,注意句柄的定义是以
h
开头的单词。
//
要传送的结构体
struct MyData{
int num;
char n ame;
};
struct MyData MyData
仁
{1,'a'};
〃 定义
MyData
类型的变量
MyData1
,并赋初值。
struct MyData *pMyData1= &MyData1;
〃 定义一个
MyData
类型的指针
pMyData1
,并让她指向
//
已经赋好初值的结构体
MyData1
//
编写线程的功能函数,让它们实现题目中的要求
DWORD WINAPI thread1(LPVOID lpParam){
UINT mymessage =0; //
定义一个消息
prin tf("Thread 1 lau nchedn");//
此时
1
已被创建,向屏幕上输出语句
3
SetThreadPriority(hthread1,THREAD_PRIORITY_ABOVE_NORMAL);
为
1
设置优先级
4
prin tf("priority of thread1 is %dn",GetThreadPriority(hthread1));
〃 获得优先级并输出
5
/*
发送消息,注意,消息是发送到消息队列中的,所以我们要等待对方的消息队 列创建完成。
*/
WaitForSingleObject(hstartevent,INFINITE);
〃等收方确定已经创建好消息队列的信号。
//
息的内容
PostThreadMessage(nThreadlD2,mymessage,(WPARAM)pMyData1,(LPARAM)NULL);
〃发消息
.5
WaitForSingleObject(hstartevent,INFINITE);
〃等待收方发送确定已经收到消息的信号
6
printf("thread2 have got the message!n");/*
发布
2
真的已经收到消息了
最终
1
prin tf("the message is %d and %cn ”,MyData1. nu m,MyData1. name);//
发布要发送消
k
return(O);
}
DWORD WINAPI thread2(LPVOID lpParam){
MSG msg;//
定义一个
MSG
结构的消息,注意
MSG
是一个结构体
struct MyData *pData;//
定义一个用于承载消息的指针,
//
要发送的结构体的,所以此处也要用指针接收。
prin tf("Thread 2 lau nched'n"); 6 |
SetThreadPriority(hthread2,THREAD_PRIORITY_LOWEST); 7
prin tf("priority of thread2 is %dn",GetThreadPriority(hthread2)); 8
post
时我是用指针的形式找到我
//
接受消息
PeekMessage(&msg,(HWND)NULL,(UINT)NULL,(UINT)NULL,(UINT)PM_NOREMOVE);//
创建 一个消息队列
后
2
SetEvent(hstartevent);
〃设置
hstartevent
为有信号状态,用于通知发方已经创建好消息队
列。
3
返回
1
GetMessage(&msg,0,0,0);
〃从消息队列中取消息并放于指定结构
if (e==O)
〃如果得到的结构体中的
//
收到
1
发送的消息了
8
{
message
值为我设置的初始值,也就是说
pData=;
〃就把
post
过来的指针传给一个新的指针
}
prin tf("the message i have got is: %d and %cn ”,pData->nu m,pData->n ame);//
发布已收
至
U
的消息。
9
SetEvent(hstartevent);
〃设置
hstartevent
为有信号状态,用于通知发放已经收到消息。
10
返
回
6
return(O);
}
int mai n()
{
hstarteve nt=CreateEve nt(NULL,FALSE,FALSE,NULL);
自动恢复为无信号状态,初始无无信 号状态
hthread
仁
CreateThread(NULL,0,thread1,NULL,0,&n ThreadIDI);
hthread2=CreateThread(NULL,0,thread2,NULL,0,&n ThreadID2);
1
2
WaitForSingleObject(hthread1,INFINITE); //
等待
threadl
执行结束。
WaitForSingleObject(hthread2,INFINITE);
〃 等待
thread2
执行结束。
//
关闭所有句柄。
CloseHa ndle(hthread1);
CloseHa ndle(hthread2);
CloseHa ndle(hstarteve nt);
函数说明:
1 SetThreadPriority
函数的参数有两个,第一个是要设置函数的句柄,如要设置
thread1
,则
此处要写
thread1
的句柄
---- hthread1.
级可以选择,此处我们设置
第二个是要设置的优先级的等级,有几个不同的等
1
的优先级比一般的高:
THREAD_PRIORITY_ABOVE_NORMAL2
的优先级低:
THREAD_PRIORITY_LOWEST
2 GetThreadPriority
函数的参数只有一个即线程的句柄。
3 WaitForSingleObject
函数的参数有两个,一个是句柄,一个是等待的时间,如
WaitForSingleObject(hstartevent,INFINITE)
就是要一直等待
startevent
这个事件有信号。
4 PostThreadMessage
函数的参数有四个,第一个为消息发送目的地的
ID
。第二个是消息的
类型,可以理解为消息的名称,是
个参数都是附加消息信息,是
构体的指针来传送这条消息。
UINT
类型的,在功能函数开始时要定义它。第三和第四
WPARAM
或者
LPARAM
类型的,在此题目中,我利用指向结
5 PeekMessage
函数用于检查线程的消息队列, 有
5
个参数,第一个是接收消息信息的
MSG
&
符号。 结构指针,此处定义
msg
就是
MSG
结构的,用于接收消息,要求用指针所以要用
第二三四参数设为空即可。最后一个表示
peek
后,是否将消息从对列中删除。
6 GetMessage
用于从消息队列中取消息,此函数可取得与指定窗口联系的消息和由
PostThreadMesssge
寄送的线程消息。此函数接收一定范围的消息值。
GetMessage
不接
收属于其他线程或应用程序的消息。 获取消息成功后,线程将从消息队列中删除该消息。
MSG
结构的指针,该结构
函
数会一直等待直到有消息到来才有返回值。第一个参数既是指向
从线程的消息队列里接收消息信息。
7 CreateEvent
用于创建一个事件,第二个参数说明这个事件是用手动还是自动复原,
FALSE
,当事件被一个等待线程释放以后, 系统将会自动将事件状态复原为无信号状态。
如果是
TRUE
,那么 、必须用
ResetEve nt
函数来 :手工将事件的状态复原到无信号状态。如果设置为
第三个参数是指定事件对象的初始状态。
如果为
TRUE
,初始状态为有信号状态; 否则为无
信号状态。
8 CreateThread
用于创建一个线程,第三个参数指向线程函数的指针,形式:
@
函数名,函
数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI ThreadProc (LPVOID pParam)
,格式不正确将无法调用成功。 最后一
个参数是:保存新线程的
id
。
创建线程的过程用黄底的标号写出
传送消息的过程用红底的标号写出
绿色为最终结果。
发布评论