20.事件通信实现进程中继者模式通话
Posted 喵小喵~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20.事件通信实现进程中继者模式通话相关的知识,希望对你有一定的参考价值。
- 运行截图
-
- 创建事件
1 HANDLE event[4] = { 0 };//事件
- 创建线程
1 HANDLE hthread[3] = {0};//代表线程
- 创建临界区
CRITICAL_SECTION cs;
- 创建聊天缓冲区
1 volatile char str[1024] = { 0 };//代表聊天内容的缓冲区
完整代码
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <Windows.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <memory.h> 6 7 //事件 8 HANDLE event[4] = { 0 }; 9 //线程 10 HANDLE hthread[3] = { 0 }; 11 //创建临界区 12 CRITICAL_SECTION cs1; 13 14 char str[1024] = { 0 };//代表聊天内容的缓冲区 15
//中间者 16 DWORD WINAPI zhong(void *p) 17 { 18 int i = 0; 19 while (++i) 20 { 21 //等待boy发送的事件0再继续执行 22 WaitForSingleObject(event[0], INFINITE); 23 ResetEvent(event[0]); 24 EnterCriticalSection(&cs1); 25 printf("%s\\n", str); 26 LeaveCriticalSection(&cs1); 27 28 //发送事件1 29 SetEvent(event[1]); 30 31 32 //等待girl发送的事件2再继续执行 33 WaitForSingleObject(event[2], INFINITE); 34 ResetEvent(event[2]); 35 EnterCriticalSection(&cs1); 36 printf("%s\\n", str); 37 LeaveCriticalSection(&cs1); 38 //发送事件3 39 SetEvent(event[3]); 40 41 Sleep(1000); 42 } 43 } 44 45 DWORD WINAPI boy(void *p) 46 { 47 int i = 0; 48 while (++i) 49 { 50 EnterCriticalSection(&cs1); 51 memset(str, \'\\0\', 1024); 52 sprintf(str, "boy第%d次说: i love you girl", i); 53 LeaveCriticalSection(&cs1); 54 55 //发送事件0 56 SetEvent(event[0]); 57 58 //等待中间者发送的事件3再执行 59 WaitForSingleObject(event[3], INFINITE); 60 ResetEvent(event[3]); 61 62 Sleep(1000); 63 } 64 return 0; 65 } 66 67 DWORD WINAPI girl(void *p) 68 { 69 int i = 0; 70 while (++i) 71 { 72 //等待中间人发送的事件1 73 WaitForSingleObject(event[1], INFINITE); 74 ResetEvent(event[1]); 75 76 EnterCriticalSection(&cs1); 77 memset(str, \'\\0\', 1024); 78 sprintf(str, "girl第%d次说: i love you boy", i); 79 LeaveCriticalSection(&cs1); 80 81 82 //发送事件2 83 SetEvent(event[2]); 84 85 Sleep(1000); 86 } 87 return 0; 88 } 89 90 void main() 91 { 92 InitializeCriticalSection(&cs1); 93 event[0] = CreateEvent(NULL, TRUE, FALSE, NULL);//第二个参数代表是否自动复位,TRUE表示手动复位需要reset,FALSE表示自动复位,不需要reset
//第三个参数是信号的状态,第四个参数代表信号的名字 94 event[1] = CreateEvent(NULL, TRUE, FALSE, NULL); 95 event[2] = CreateEvent(NULL, TRUE, FALSE, NULL); 96 event[3] = CreateEvent(NULL, TRUE, FALSE, NULL); 97 98 hthread[0] = CreateThread(NULL, 0, boy, NULL, 0, NULL); 99 hthread[1] = CreateThread(NULL, 0, girl, NULL, 0, NULL); 100 hthread[2] = CreateThread(NULL, 0, zhong, NULL, 0, NULL); 101 102 103 WaitForMultipleObjects(2, hthread, TRUE, INFINITE); 104 }
以上是关于20.事件通信实现进程中继者模式通话的主要内容,如果未能解决你的问题,请参考以下文章
python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式
是否有在单个活动中处理多个片段的 Android 设计模式?
中继fetchQuery:如何在没有片段结构的情况下获取查询结果