按书上的代码调不出来,无错,但是空白。
于是,我只好加了一个WaitSingleObject,
结果,只能显示截断的字符,于是调协好 Character Set,才一切OK。
线程间同步,进程间通信,内存分配。这差不多算是系统编程的三大重点了。
涉及了内存,CPU。
1 /* ************************************ 2 *《精通Windows API》 3 * 示例代码 4 * Event.c 5 * 7.2.1 演示使用Event同步线程 6 **************************************/ 7 8 /* 头文件 */ 9 #include <windows.h> 10 #include <stdio.h> 11 /* 常量定义 */ 12 #define NUMTHREADS 3 13 #define BUFFER_SIZE 16 14 #define FOR_TIMES 5 15 /* 全局变量 */ 16 HANDLE hEvent; 17 HANDLE hThread; // 用于同步 18 BYTE lpSharedBuffer[16] = {0}; // 共享内存 19 /* 函数声明 */ 20 void UseEvents(void); 21 DWORD WINAPI EventFunction(LPVOID lpParam); 22 23 /************************************* 24 * int main(void) 25 * 功能 演示 26 * 27 * 参数 未使用 28 **************************************/ 29 int main() 30 { 31 32 UseEvents(); 33 WaitForSingleObject(hThread, INFINITE); 34 CloseHandle(hThread); 35 36 } 37 38 /************************************* 39 * void UseEvents(void) 40 * 功能 演示Event的使用方法 41 * 42 * 参数 未使用 43 **************************************/ 44 void UseEvents(void) 45 { 46 //HANDLE hThread; 47 48 hEvent = CreateEvent( 49 NULL, // 默认安全属性 50 TRUE, // 手工重置 51 FALSE, // 初始为未置位的 52 NULL // 未命名 53 ); 54 // 判断是否创建成功 55 if (hEvent == NULL) 56 { 57 printf("CreateEvent failed (%d)\n", GetLastError()); 58 return; 59 } 60 // 创建线程 61 hThread = CreateThread(NULL, 0, 62 EventFunction, 63 NULL, 64 0, NULL); 65 if (hThread == NULL) 66 { 67 printf("CreateThread failed (%d)\n", GetLastError()); 68 return; 69 } 70 Sleep(200); // 可以做一些其他处理 71 // 向共享内存中复制数据 72 CopyMemory(lpSharedBuffer,"Event",lstrlen("Event")); 73 // 设置 Event 使ThreadFunction线程可以开始复制数据 74 SetEvent(hEvent); 75 } 76 77 /************************************* 78 * DWORD WINAPI EventFunction(LPVOID lpParam) 79 * 功能 线程函数,读共享内存 80 * 81 * 参数 未使用 82 **************************************/ 83 DWORD WINAPI EventFunction(LPVOID lpParam) 84 { 85 DWORD dwWaitResult; 86 // 等待,直到事件被置位 87 dwWaitResult = WaitForSingleObject( 88 hEvent, // Event 句柄 89 INFINITE); // 无限等待 90 if (dwWaitResult != WAIT_OBJECT_0) 91 { 92 printf("Wait error: %d\n", GetLastError()); 93 return 0; 94 } 95 // 读共享内存 96 printf(lpSharedBuffer); 97 printf("\nlpSharedBuffer"); 98 // 重置事件 99 if (! ResetEvent(hEvent) ) 100 { 101 printf("SetEvent failed (%d)\n", GetLastError()); 102 return 0; 103 } 104 return 1; 105 }