/* * Worker.cpp * * Sample code for "Multithreading Applications in Win32" * This is from Chapter 14, Listing 14-3 * * Demonstrate using worker threads that have * their own message queue but no window. */ #define WIN32_LEAN_AND_MEAN #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <process.h> #include <string.h> #include "MtVerify.h" unsigned WINAPI ThreadFunc(void* p); HANDLE ghEvent; #define WM_JOB_PRINT_AS_IS WM_APP + 0x0001 #define WM_JOB_PRINT_REVERSE WM_APP + 0x0002 #define WM_JOB_PRINT_LOWER WM_APP + 0x0003 #define WM_LEIWEI WM_APP + 0x0004 int main(VOID) { HANDLE hThread; unsigned tid; // Give the new thread something to talk // to us with. //创建手动事件 ghEvent = CreateEvent(NULL, TRUE, FALSE, NULL); unsigned CurrentId = GetCurrentThreadId(); UNREFERENCED_PARAMETER(CurrentId); hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, 0, 0, &tid ); MTVERIFY(hThread); // This thread has to wait for the new thread // to init its globals and msg queue. WaitForSingleObject(ghEvent, INFINITE);//等待事件有信号 // The only place in the book we get to use // the thread ID! //strdup 调用的是malloc所以需要free char *szText = strdup("Thank you for buying this book.\n"); PostThreadMessage(tid, WM_JOB_PRINT_AS_IS, NULL, (LPARAM)szText); szText = strdup("Text is easier to read forward.\n"); PostThreadMessage(tid, WM_JOB_PRINT_REVERSE, NULL, (LPARAM)szText); szText = strdup("\nLOWER CASE IS FOR WHISPERING.\n"); PostThreadMessage(tid, WM_JOB_PRINT_LOWER, NULL, (LPARAM)szText); Sleep(4000); //给线程发消息,退出 PostThreadMessage(tid,WM_QUIT,0,0); WaitForSingleObject(hThread, INFINITE);//等待线程退出,然后关闭句柄 CloseHandle(hThread); system("pause"); return 0; } VOID CALLBACK TimerFunc( HWND hwnd, // handle of window for timer messages UINT uMsg, // WM_TIMER message UINT idEvent, // timer identifier DWORD dwTime ) // current system time { //取消编译器的警告,没有引用的变量 UNREFERENCED_PARAMETER(hwnd); UNREFERENCED_PARAMETER(uMsg); printf("onTimer function\n"); // PostThreadMessage(GetCurrentThreadId(), WM_QUIT,0,0); unsigned id = GetCurrentThreadId(); PostThreadMessage(id, WM_LEIWEI,0,0); } /* * Call a function to do something that terminates * the thread with ExitThread instead of returning. */ unsigned WINAPI ThreadFunc(LPVOID n) { UNREFERENCED_PARAMETER(n); MSG msg; // This creates the message queue. //创建一个消息队列 PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); //设置事件有激活 SetEvent(ghEvent); // We'll run for two seconds SetTimer(NULL, NULL, 500, (TIMERPROC)TimerFunc); while (GetMessage(&msg, NULL, 0, 0)) { char *psz = (char *)msg.lParam; switch(msg.message) { case WM_JOB_PRINT_AS_IS: printf("%s", psz); free(psz); break; case WM_JOB_PRINT_REVERSE: printf("%s", strrev(psz)); free(psz); break; case WM_JOB_PRINT_LOWER: printf("%s", _strlwr(psz)); free(psz); break; case WM_LEIWEI: printf("timer:............\n"); break; default: printf("message id=%0X\n",msg.message); DispatchMessage(&msg); } } return 0; }