ZeroMQ线程通讯

来源:互联网 发布:pla算法 编辑:程序博客网 时间:2024/05/21 17:42
源代码示例: git clone git://github.com/imatix/zguide.git; http://www.kongch.com/2012/01/zeromq-pattern-pipeline/
zhelpers.h: 一个供C语言使用的ZMQ功能函数库。https://github.com/imatix/zguide/blob/master/examples/C/zhelpers.h 
pthread.h: POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。Windows操作系统也有其移植版pthreads-win32。ftp://sourceware.org/pub/pthreads-win322


/******************************************************************** author  :   Clark/陈泽丹 created :   2014-6-21 purpose :   线程辅助类*********************************************************************/#pragma once#include "ThreadHelper.h"class ZmqThreadProxy{public:ZmqThreadProxy();boolStart( long _sign, IThreadUnit *_p_fun );boolIsRun();virtual voidStop();//有些线程的逻辑处理是支持中断,需重写stopprivate:boolm_is_run;longm_sign;};

#include "ZmqThread.h"#include <iostream>#include "ZmqHelpler.h"#include <Windows.h>#define START_CMD"inproc://zmqthread_start_%d"#define STOP_CMD"inproc://zmqthread_stop_%d"class AdapterThread: public IThreadUnit{public:AdapterThread( long _sign, IThreadUnit *_p_fun):m_sign(_sign),mp_fun(_p_fun){}virtual ~AdapterThread(){if( 0 != mp_fun ){delete mp_fun;mp_fun = 0;}}virtual void Server(){//--必须先行建立节点,不然不会保存发送接收的信息缓存char addr[256];char msg[64];_snprintf_s( addr, sizeof(addr)-1, START_CMD, m_sign );ReqSkt stop_thread( addr );_snprintf_s( addr, sizeof(addr)-1, STOP_CMD, m_sign );RepSkt start_thread( addr );//开始stop_thread.BeginSend("START", sizeof("START"));stop_thread.End();//执行mp_fun->Server();//结束start_thread.BeginRecv(msg, sizeof(msg));start_thread.End();}private:IThreadUnit *mp_fun;long m_sign;};ZmqThreadProxy::ZmqThreadProxy():m_is_run(false),m_sign(0){}bool ZmqThreadProxy::IsRun(){return m_is_run;}bool ZmqThreadProxy::Start( long _sign, IThreadUnit *_p_fun ){if( !m_is_run ){m_sign = _sign;char addr[256];_snprintf_s( addr, sizeof(addr)-1, START_CMD, _sign );RepSkt start_thread( addr );IThreadUnit *p_server = new AdapterThread( _sign, _p_fun );g_threadpool.CreateThread( p_server );char msg[64];start_thread.BeginRecv(msg, sizeof(msg));m_is_run = true;start_thread.End();return true;}return false;}void ZmqThreadProxy::Stop(){if( m_is_run ){char addr[256];_snprintf_s( addr, sizeof(addr)-1, STOP_CMD, m_sign );ReqSkt stop_thread( addr );stop_thread.BeginSend( "STOP", sizeof("STOP") );m_is_run = false;stop_thread.End();}}


0 0
原创粉丝点击