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

目录
相关文章
实现Java多线程中的线程间通信
实现Java多线程中的线程间通信
|
Java 程序员
从菜鸟到大神:JAVA多线程通信的wait()、notify()、notifyAll()之旅
【6月更文挑战第21天】Java多线程核心在于wait(), notify(), notifyAll(),它们用于线程间通信与同步,确保数据一致性。wait()让线程释放锁并等待,notify()唤醒一个等待线程,notifyAll()唤醒所有线程。这些方法在解决生产者-消费者问题等场景中扮演关键角色,是程序员从新手到专家进阶的必经之路。通过学习和实践,每个程序员都能在多线程编程的挑战中成长。
148 6
|
12月前
多线程通信和同步的方式有哪些?
【10月更文挑战第6天】
771 61
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
305 0
|
安全 Java
JAVA多线程通信新解:wait()、notify()、notifyAll()的实用技巧
【6月更文挑战第20天】Java多线程中,`wait()`, `notify()`和`notifyAll()`用于线程通信。在生产者-消费者模型示例中,它们确保线程同步。`synchronized`保证安全,`wait()`在循环内防止虚假唤醒,`notifyAll()`避免唤醒单一线程问题。关键技巧包括:循环内调用`wait()`,优先使用`notifyAll()`以保证可靠性,以及确保线程安全和正确处理`InterruptedException`。
189 0
|
11月前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
110 3
|
12月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
153 1
|
12月前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
216 1
|
12月前
|
Java
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件成立时被唤醒,从而有效解决数据一致性和同步问题。本文通过对比其他通信机制,展示了 `wait()` 和 `notify()` 的优势,并通过生产者-消费者模型的示例代码,详细说明了其使用方法和重要性。
145 1
|
12月前
|
Java