ZeroMQ线程通讯

源代码示例: 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();
	bool			Start( long _sign, IThreadUnit *_p_fun );
	bool			IsRun();
	virtual void	Stop();	//有些线程的逻辑处理是支持中断,需重写stop

private:
	bool		m_is_run;
	long		m_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();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值