多线程同步与通信 Windows

本文介绍了一个基于Windows的消息处理机制与线程间通信的例子。通过创建自定义消息和使用PostThreadMessage发送消息到线程的消息队列,实现主线程与工作线程之间的消息传递。同时展示了如何在工作线程中接收并处理这些消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "stdafx.h"
#include "stdio.h"
#include <string.h>
#include <process.h>
#include <windows.h>

#define WM_MYMSG WM_USER+100

HANDLE hStartEvent; // thread start event

unsigned __stdcall ThreadFunc( void* pArguments )
{
 MSG msg;
    printf( "In  thread.../n" );

 PeekMessage(&msg, NULL, WM_USER, WM_USER+1000, PM_NOREMOVE);
 if(!SetEvent(hStartEvent)) //set thread start event
    {
        printf("set start event failed,errno:%d/n",::GetLastError());
        return -1;
    }
   
    while(true)
    {
        if(GetMessage(&msg,0,0,0)) //get msg from message queue
        {
            switch(msg.message)
            {
            case WM_MYMSG:
                char * pInfo = (char *)msg.wParam;
                printf("recv %s/n",pInfo);
    if(strcmp(pInfo,"msg_9")==0)
    {
     delete[] pInfo;
     _endthreadex( 0 );
    }
                delete[] pInfo;
                break;
            }
        }
    };

    _endthreadex( 0 );
    return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{  
 HANDLE hThread=NULL;
    unsigned threadID;

 hStartEvent = CreateEvent(0,FALSE,FALSE,0);
 if(hStartEvent == 0)
    {
        printf("create start event failed,errno:%d/n",::GetLastError());
        return -1;
    }
 ResetEvent(hStartEvent);
    hThread = (HANDLE)_beginthreadex( NULL, 0, &ThreadFunc, NULL, 0, &threadID );
 if(hThread==NULL)
 {
  printf( "create thread err!/n");
  CloseHandle( hThread );
  return -1;
 }

 WaitForSingleObject(hStartEvent,INFINITE);
    CloseHandle(hStartEvent);

    int count = 0;
    for (;count<20;)
    {
        char* pInfo = new char[20]; //create dynamic msg
        sprintf(pInfo,"msg_%d",++count);
        if(!PostThreadMessage(threadID,WM_MYMSG,(WPARAM)pInfo,0))//post thread msg
        {
            printf("post message failed,errno:%d/n",::GetLastError());
            delete[] pInfo;
        }
       Sleep(1000);
    }

    WaitForSingleObject( hThread, INFINITE );
    CloseHandle( hThread );

 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值