文档章节

0MQ绑定Delphi版-说明

炽火
 炽火
发布于 2013/02/20 19:44
字数 1034
阅读 4592
收藏 19

0MQ绑定Delphi版

这是一份ZMQ绑定。测试环境Delphi7,BDS2006,FPC 2.6.0(目前仅Window)。

概述

程序包中含有一个dll的wrapper(zmq.pas),和一个高层API(zmqapi.pas)。

它应该能够工作于ZMQ 2.2.0,和3.2.0 rc1(实验性)。要使用v3.2的dll,在zmq.inc中定义zmq3({$define zmq3})。dll来自于官方发行版

使用

你应该使用高层API,那会节省你大量时间,而且附带效果是代码也将更容易阅读。

首先,你应该创建一个上下文

<!--lang: delphi-->
context := TZMQContext.Create; 

有很多种套接字类型,参见指南,每种都有一个常量。要创建例如一个REP套接字,这么写:

<!--lang: delphi-->

socket := context.Socket( stRep );

// 绑定套接字
socket.bind( 'tcp://*:5555' );

// 连接套接字
socket.connect( 'tcp://localhost:5555' );

API中有很多中方法来发送消息。你可以发送单份,或多份消息,阻塞或非阻塞(v3中称为dontwait不等待)模式。

<!--lang: delphi-->

// 阻塞模式(默认)发送一个字符串就像这么简单:
socket.send( 'Hello' );

// 或者用非阻塞模式
socket.send( 'Hello', [rsfNoBlock] );
// 这种情况下如果消息无法入队则将抛出一个EZMQException异常,
// 异常类型为EAGAIN。

// 从stream发送数据(别忘了设置stream的位置到读取位置)
socket.send( stream, size );

// 发送多段消息。
// 多个字符串:
socket.send( ['Hello','World'] );

// 这等同于:
socket.send( 'Hello', [rsfSndMore] );
socket.send( 'World' );

// 或者使用TStrings。
tsl := TStringList.Create;
tsl.Add( 'Hello' );
tsl.Add( 'World' );
socket.send( tsl );
tsl.Free;

接收消息就像这么容易:

<!--lang: delphi-->

msize := socket.recv( msg );
// 新的消息到了msg中,而msize持有消息的长度

// 到一个stream中
msize := socket.recv( stream );

// 读取多段消息
tsl := TStringList.Create;
mcount := socket.recv( tsl );
// 这将会添加多个消息的部分到字符串列表,并返回接收的消息数量。

CTRL+C的处理

这是个小技巧。在Windows中信号处理与posix系统有所不同。阻塞调用不会接收到SIGINT,只会持续的阻塞。要克服这个问题,已安装的处理器终止了上下文,所以阻塞调用例如recvpoll,等等...将接收到ETERM。这仅在Windows。

如果你将你的无限循环代码写为这样,你可以很干净的终止。

<!--lang: delphi-->

while not context.Terminated do
try
  socket.recv( msg );
except
  // 处理异常,或者
  context.Terminate;
end;

context.Free;

轮询

轮询可以工作在两种不同方式,让我们称第一种为_同步_,第二种为_异步_方式。_异步_版本创建了一个线程,在其中做轮询。

  • 同步

    <!--lang: delphi-->

    // 创建上下文 context := TZMQContext.Create; socket := context.Socket( stDealer ); socket.connect( address );

    // 创建轮询器。参数true告诉轮询器使用同步轮询 poller := TZMQPoller.Create( true );

    // 注册套接字。 poller.register( socket, [pePollIn] );

    timeout := 100; // 100ms while not context.Terminated do begin rc := poller.poll(timeout); if rc > 0 then do something... end;

    poller.Free; socket.Free; context.Free;

  • 异步方式

这个实现使用了一种reactor模式,轮询器启动了一个新的线程,并在类和创建的线程之间创建了一对套接字连接。所以这个轮询器的实现不是线程安全的,不要在不同线程中去注册、反注册套接字。

    <!--lang: delphi-->

    procedure TMyClass.pollerEvent( socket: TZMQSocket; event: TZMQPollEvents );
      begin
        do something...
      end;
      
    // 创建上下文。
    context := TZMQContext.Create;
    
    socket := context.Socket( stDealer );
    socket.connect( address );
    
    // 创建轮询器。第二个参数可以为nil,此时轮询器会创建自己的上下文。
    poller := TZMQPoller.Create( false, context );
    
    poller.onEvent := pollerEvent;

    // 注册套接字。如果第三个参数为true,注册将阻塞直到套接字注册完毕。
    poller.register( socket, [pePollIn], false );

监视套接字(仅在v3.2可用)

<!--lang: delphi-->

// 像这样定义一个回调
procedure TMyClass.MonitorCallback( event: TZMQEvent );
begin
  // do something.
end;

// 注册这个回调
socket.RegisterMonitor( MonitorCallback, cZMQMonitorEventsAll );

// MonitorCallback将会在由RegisterMonitor创建的分离的线程中被调用。

// 你可以这么调用来反注册监视。
socket.DeRegisterMonitor; 

示例

示例位于 zguide examples/Delphi 目录.

变更

  • New poller class
  • poll function of TZMQPoller has a new optional parameter "pollCount".
  • Upgrade dll-s to v3.2.2 RC2
  • New monitoring logic implemented.
  • Default ZMQ version for the binding is now 3.2 ( can switch back to 2.2 by not defining zmq3 in the zmq.inc file )

作者

以下为项目的贡献人员:

Balazs Varga <bb.varga@gmail.com> 
Stathis Gkotsis <stathis.gkotsis@gmail.com>
Stephane Carre <scarre.lu@gmail.com>

版权

遵循 GNU Lesser General Public License (LGPL) 条款将被授权自由使用此软件。细节请参看包含在发行内容中的文件COPYING.LESSER

© 著作权归作者所有

炽火
粉丝 8
博文 8
码字总数 8893
作品 0
朝阳
高级程序员
私信 提问
加载中

评论(7)

haitaosoft
haitaosoft
zeromq出了新版本,这个wrapper和高层API 有没有更新?
uian2000
uian2000

引用来自“uian2000”的评论

很喜欢炽火动作条,功能强大,难得还不要裤子~

怎么从手机客户端看不到评论了,删除了么?

能看到的,下拉刷新评论失败,点圈圈就可以~
uian2000
uian2000
很喜欢炽火动作条,功能强大,难得还不要裤子~

怎么从手机客户端看不到评论了,删除了么?
炽火
炽火 博主
经过本人测试,3.2.2 RC1发行版libzmq的dll无法在XP运行,原因是使用了仅在Vista之后办法才有的Kernel32.dll的API。推测要在XP下运行,可能需要重新编译。
炽火
炽火 博主

引用来自“uian2000”的评论

博主的名字让俺想到几年前的炽火动作条…

呵呵,zBar正是鄙人作品。
uian2000
uian2000
博主的名字让俺想到几年前的炽火动作条…
LEAN
LEAN
有用过
0MQ 4.0.1 稳定版发布

注意,该版本非常新,现在还没有广泛的多编程语言支持。 下载之前请先检查 check your language binding 看是否支持 0MQ。 下载地址: POSIX tarball | Windows sources Windows installers...

少帮主
2013/10/14
3.7K
5
GPS接收器控件TGPS介绍及下载地址

TGPS是一个Delphi控件,包装了GPS接收器的相关接口。TGPS是一个GPS接收器接口,它可以用于所有发送NMEA 0183数据的GPS接收器,同时也可以连接计算机的串行通信端口。 TGPS的功能特性包括: ...

javascript1
2014/05/05
114
0
ZeroMQ 3.2.3 发布,轻量级消息内核

0MQ (ZeroMQ) 是一个轻量级消息内核. 它支持主流的操作系统, 并提供各种开发语言的绑定. 目前发布的ZeroMQ 3.2.3主要是修复以下的bug: * LIBZMQ-526 Assertion failure "Invalid argument (...

chai2010
2013/05/11
2.3K
7
ZeroMQ 核心引擎 libzmq 4.2.0 稳定版发布

ZeroMQ 核心引擎 libzmq 4.2.0 稳定版发布了。0MQ (ZeroMQ) 是一个轻量级消息内核。它可用于 C、C++、Python、.NET /Mono、Fortran 和 Java 语言。它运行在 AIX , FreeBSD 的,基于 HP - U...

局长
2016/11/05
5.2K
18
创建交互式地项目甘特图​以及日程安排图的控件GTP.NET

GTP.NET是一个综合全面的基于.NET的甘特图控件,可以帮助软件开发人员可视化和熟练地操作基于时间的信息,控件包含了一系列界面控件以便操作时间块。使用该控件可以创建交互式地项目甘特图以及...

netkongjian
2014/06/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Xss过滤器(Java)

问题 最近旧的系统,遇到Xss安全问题。这个系统采用用的是spring mvc的maven工程。 解决 maven依赖配置 <properties><easapi.version>2.2.0.0</easapi.version></properties><dependenci......

亚林瓜子
33分钟前
2
0
Navicat 快捷键

操作 结果 ctrl+q 打开查询窗口 ctrl+/ 注释sql语句 ctrl+shift +/ 解除注释 ctrl+r 运行查询窗口的sql语句 ctrl+shift+r 只运行选中的sql语句 F6 打开一个mysql命令行窗口 ctrl+l 删除一行 ...

低至一折起
今天
7
0
Set 和 Map

Set 1:基本概念 类数组对象, 内部元素唯一 let set = new Set([1, 2, 3, 2, 1]); console.log(set); // Set(3){ 1, 2, 3 } [...set]; // [1, 2, 3] 接收数组或迭代器对象 ...

凌兮洛
今天
1
0
PyTorch入门笔记一

张量 引入pytorch,生成一个随机的5x3张量 >>> from __future__ import print_function>>> import torch>>> x = torch.rand(5, 3)>>> print(x)tensor([[0.5555, 0.7301, 0.5655],......

仪山湖
今天
5
0
OSChina 周二乱弹 —— 开发语言和语言开发的能一样么

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌:#今日歌曲推荐# 分享The Score的单曲《Revolution》 《Revolution》- The Score 手机党少年们想听歌,请使劲儿戳(这里) @批判派...

小小编辑
今天
2.8K
19

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部