博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC++线程通信
阅读量:6212 次
发布时间:2019-06-21

本文共 1734 字,大约阅读时间需要 5 分钟。

这是我现在使用的一种线程通信方式的代码片段,两个线程之间通过自定义消息进行通知,
#define MY_MSG WM_USER+100 //线程通信的自定义消息
//消费者
DWORD Consumer::Run()
{//创建线程并启动
    DWORD ThreadId;
    m_hThread = CreateThread( NULL,0,Routine,0,0,&ThreadId );//创建更新线程
    if( NULL == m_hThread )
    {
        return -1;//启动失败
    }
    return ThreadId;//线程启动成功
}
DWORD WINAPI Consumer::Routine( LPVOID lParam)
{//线程运行函数
    std::cout<<"消费者线程启动\n";
    MSG msg;
    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
    while(true)
    {
        if(GetMessage(&msg,0,0,0)) //get msg from message queue
        {
            switch(msg.message)
            {
            case MY_MSG:
                //do something here
                std::cout<<"收到消息"<<std::endl;
                break;
            }
        }
    };
    return 0;
}
//生产者
DWORD Producer::Run(LPDEALFUNCTION dealfun,LPVOID lParam)
{
    DWORD ThreadId;
    m_DealFun = dealfun;
    m_DealFunParam = NULL;
    m_hThread = CreateThread( NULL,0,Routine,this,0,&ThreadId );//创建监控线程
    if( NULL == m_hThread )
    {
        return -1;
    }
    return ThreadId;
}
DWORD WINAPI Producer::Routine( LPVOID lParam )
    Producer& obj = *(Producer*)lParam;//生产者对象
    while( !obj.m_bRequestStop )
    {//线程就不断运行直到收到用户的退出请求
        obj.m_DealFun(obj.m_DealFunParam );
    }
    return 0;
}
//main.cpp
HANDLE hStartEvent; // thread start event
unsigned nConsumerID,nProducerID;
void __stdcall MyDeal( LPVOID lParam )
{
    std::cout<<"开始发送消息.."<<std::endl;
    if(!PostThreadMessage(nConsumerID,MY_MSG,NULL,NULL))//post thread msg
    {
        printf("post message failed,errno:%d\n",::GetLastError());
    }
    ::Sleep(1000);
}
int main()
{
    Consumer consumer;
    nConsumerID = consumer.Run();//启动更新线程
    if(nConsumerID == -1)
    {
        std::cout<<"start thread failed"<<std::endl;
        return -1;
    }
    Producer pProducer;
    nProducerID = pProducer.Run(&MyDeal, 0 );//启动监控线程
    if( nProducerID==-1 )
        return -1;
    return 0;
}
本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/03/14/1106481.html,如需转载请自行联系原作者
你可能感兴趣的文章
centos下yum安装ffmpeg
查看>>
Android控件之AutoCompleteTextView、MultiAutoCompleteTextView探究
查看>>
AJAX是什么? AJAX的交互模型(流程)?同步和异步的区别? AJAX跨域的解决办法?
查看>>
awk一些简单的应用
查看>>
给 Android 开发者的 RxJava 详解
查看>>
Html元素
查看>>
Kali安装OWTF、PIP、tornado
查看>>
IOS UIWebView调用H5页面后退方法出现“about:blank”
查看>>
12. Integer to Roman
查看>>
dubbo之hessian序列化数据丢失
查看>>
ARM嵌入式Linux系统开发详解(第2版)
查看>>
Ubuntu failed to run the android sdk manager
查看>>
centos环境下php7安装记录
查看>>
centos yum错误
查看>>
JAVA NIO Connection reset by peer 异常
查看>>
Mac不支持写NTFS
查看>>
一列中显示不同的编辑风格
查看>>
flex 学习笔记 graphics(一)
查看>>
我的友情链接
查看>>
我的友情链接
查看>>