VC++线程通信

简介:
这是我现在使用的一种线程通信方式的代码片段,两个线程之间通过自定义消息进行通知,

#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,如需转载请自行联系原作者

目录
相关文章
|
15天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
1月前
|
Python
如何在Python中实现线程之间的同步和通信?
【2月更文挑战第17天】【2月更文挑战第51篇】如何在Python中实现线程之间的同步和通信?
|
4月前
|
Java
线程间通信之Object.wait/notify实现
线程间通信之Object.wait/notify实现
30 0
|
4月前
|
消息中间件 存储 Unix
进程间通信和线程间通信总结
写在前面 面试的时候一定不要疲劳战,比如上午面了一个,然后中午不休息直接赶到另外一个相距比较远的公司,影响状态。 面试的时候一定不要紧张,不管对方有几个人,总之面试的时候做好充分准备,休息好,放松心态。 好了,言归正传,开始总结。
39 0
|
6月前
|
安全 Java 调度
Java多线程编程的默契对话:线程通信的艺术
Java多线程编程的默契对话:线程通信的艺术
38 0
|
5月前
19.3 Boost Asio 多线程通信
多线程服务依赖于两个通用函数,首先`boost::bind`提供了一个高效的、简单的方法来创建函数对象和函数对象适配器,它的主要功能是提供了一种将函数和它的参数绑定到一起的方法,这种方法可以将具有参数的成员函数、普通函数以及函数对象转化为不带参数的函数对象。当参数绑定后则下一步就需要使用多线程功能,Boost库中提供了`boost::thread`库,`boost::thread`可以用于创建线程、启动线程、等待线程执行结束以及线程间通信等多种操,有了这两个关键库那么我们只需要`accept.accept(*sock)`等待套接字上线,当有套接字上线后则自动创建`MyThread`子线程,
47 0
19.3 Boost Asio 多线程通信
|
4月前
|
安全 Java 数据库连接
详细介绍线程间通信
详细介绍线程间通信 线程间通信是指在多线程编程中,不同的线程之间通过某种方式交换信息的过程。这是一个重要的概念,因为线程之间的协作是实现复杂并发系统的关键。 下面是一些线程间通信的常见方式和示例:
353 0
|
1月前
|
消息中间件 并行计算 网络协议
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
34 0
|
1月前
|
存储 Java 数据库连接
线程通信(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
线程通信(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
34 0
|
1月前
|
安全
多线程通信
多线程通信