源代码示例: 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
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();
}
}