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

创建线程的过程用黄底的标号写出

传送消息的过程用红底的标号写出

绿色为最终结果。