如何在 GTK/QT/Clutter 应用程序中使用 ZeroMQ?

2023-11-25

In gtk应用程序的所有执行都发生在gtk_main功能。其他图形框架作品也有类似的事件循环,例如app.exec for QT and clutter_main for Clutter。然而ZeroMQ基于以下假设:while (1) ...它被插入的循环(例如参见here举些例子)。

您如何结合这两种执行策略?

我目前想在用 C 编写的杂乱应用程序中使用 Zeromq,所以我当然希望直接回答这个问题,但也请添加其他变体的答案。


组合 zmq 和 gtk 或杂乱的正确方法是将 zmq 队列的文件描述符连接到主事件循环。 fd 可以通过使用来检索

int fd;
size_t sizeof_fd = sizeof(fd);
if(zmq_getsockopt(socket, ZMQ_FD, &fd, &sizeof_fd))
      perror("retrieving zmq fd");

将其连接到主循环是使用 io_add_watch 的问题:

GIOChannel* channel = g_io_channel_unix_new(fd);    
g_io_add_watch(channel, G_IO_IN|G_IO_ERR|G_IO_HUP, callback_func, NULL);

在回调函数中,首先需要检查是否真的有东西要读,然后再进行读取。否则,该函数可能会阻塞等待 IO。

gboolean callback_func(GIOChannel *source, GIOCondition condition,gpointer data)
{
    uint32_t status;
    size_t sizeof_status = sizeof(status);   

    while (1){
         if (zmq_getsockopt(socket, ZMQ_EVENTS, &status, &sizeof_status)) {
             perror("retrieving event status");
             return 0; // this just removes the callback, but probably
                       // different error handling should be implemented
         }
         if (status & ZMQ_POLLIN == 0) {
             break;
         }

         // retrieve one message here
    }
    return 1; // keep the callback active
}

请注意:这并没有经过实际测试,我从 Python+Clutter 进行了翻译,这就是我使用的,但我很确定它会起作用。 作为参考,下面是实际有效的完整 Python+Clutter 代码。

import sys
from gi.repository import Clutter, GObject
import zmq

def Stage():
    "A Stage with a red spinning rectangle"
    stage = Clutter.Stage()

    stage.set_size(400, 400)
    rect = Clutter.Rectangle()
    color = Clutter.Color()
    color.from_string('red')
    rect.set_color(color)
    rect.set_size(100, 100)
    rect.set_position(150, 150)

    timeline = Clutter.Timeline.new(3000)
    timeline.set_loop(True)

    alpha = Clutter.Alpha.new_full(timeline, Clutter.AnimationMode.EASE_IN_OUT_SINE)
    rotate_behaviour = Clutter.BehaviourRotate.new(
        alpha, 
        Clutter.RotateAxis.Z_AXIS,
        Clutter.RotateDirection.CW,
        0.0, 359.0)
    rotate_behaviour.apply(rect)
    timeline.start()
    stage.add_actor(rect)

    stage.show_all()
    stage.connect('destroy', lambda stage: Clutter.main_quit())
    return stage, rotate_behaviour

def Socket(address):
    ctx = zmq.Context()
    sock = ctx.socket(zmq.SUB)
    sock.setsockopt(zmq.SUBSCRIBE, "")
    sock.connect(address)
    return sock

def zmq_callback(queue, condition, sock):
    print 'zmq_callback', queue, condition, sock

    while sock.getsockopt(zmq.EVENTS) & zmq.POLLIN:
        observed = sock.recv()
        print observed

    return True

def main():
    res, args = Clutter.init(sys.argv)
    if res != Clutter.InitError.SUCCESS:
        return 1

    stage, rotate_behaviour = Stage()

    sock = Socket(sys.argv[2])
    zmq_fd = sock.getsockopt(zmq.FD)
    GObject.io_add_watch(zmq_fd,
                         GObject.IO_IN|GObject.IO_ERR|GObject.IO_HUP,
                         zmq_callback, sock)

    return Clutter.main()

if __name__ == '__main__':
    sys.exit(main())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 GTK/QT/Clutter 应用程序中使用 ZeroMQ? 的相关文章

  • gtkmm 的 CMake 错误

    我正在使用 Debian 8 并安装了 libgtkmm 3 0 以及 dev 现在我有一个使用 gtkmm 的非常简单的程序 基本上是一个 Hello World 主要 cpp include include BrowserWindow
  • 使用 PyGObject 正确构建并突出显示 GtkPopoverMenu

    我正在尝试举一个正确的例子Gtk HeaderBar with Gtk PopoverMenus显示了如何使用不同的小部件 我查看了很多示例和代码 但无法弄清楚如何工作Gtk ModelButton 尤其这个句子 https develop
  • 如何使用GTK开发类似Eclipse的界面?

    我想使用 GTKMM 编写一个桌面应用程序 我希望界面由不同的面板组成 就像在 Eclipse 中一样 您有项目资源管理器 控制台 属性等 您应该能够拖动面板来更改其位置 关闭它们并弹出它们 不确定是否可以弹出 Eclipse 中的面板 但
  • 如何在python2.7中安装gtk?

    我正在使用 Debian 6 04 和 Python 2 7我编译了Python 2 7 configure make make install 在控制台中 gt python2 7 Python 2 7 3 default Jul 28
  • ZeroMQ套接字在什么情况下会丢弃或无法传递消息?

    是否有某种规范或其他解释来描述正常情况 对于每种通信类型 您可以预期在 ZeroMQ 套接字上发送的消息不会被 所有 侦听进程接收 例如 我有一个实验程序 它基本上假设所有订阅者PUB套接字接收在该套接字上发送的所有消息 在初始化握手之后
  • Gtk Widget 到 Winform

    是否可以使用 System Windows Forms 将 Gtk 小部件嵌入到应用程序中 谢谢 两个工具包都使用自己单独的 UI Mainloop 来处理事件 例如鼠标移动 按钮按下等 因此 将两者混合实际上是不可能的 尽管几年前 Gtk
  • 如何使用 PyGTK 和 PyCairo 在窗口中获得透明背景?

    我一直在努力使用 PyGTK 创建一个没有装饰和透明背景的窗口 然后我会用 Cairo 绘制窗口的内容 但我无法让它发挥作用 我尝试了很多不同的方法 但都失败了 这是其中之一 usr bin env python import pygtk
  • 对于连接到单个服务器的多个客户端,我应该使用哪种双向 ZeroMQ 模式?

    我有多个 数千个 客户端连接到单个服务器并发送一些日志数据 服务器分析数据并在必要时做出响应 PUB SUB是一个方向 监视器示例 REQ REP无法识别对等方并专门回复对等方 仅适用于 ACK 等 我需要注册这些客户端 识别他们并能够在分
  • 无法以编程方式减小 gtk 窗口的大小

    以编程方式调整 gtk 窗口大小时 我似乎遇到了问题 问题是 一旦我将窗口的宽度和高度增加到 800x600 我似乎无法将其缩小回原来的大小 400x200 下面是示例代码 有人遇到过这样的问题吗 include
  • 将 ZeroMQ 与 C# 和 inproc 传输一起使用

    我正在尝试 ZeroMQ 并试图得到某物在职的 我的第一个想法是使用 inproc 传输设置 REP REQ 看看是否可以在两个线程之间发送消息 下面的大部分代码取自 clzmq 示例 但它似乎不起作用 服务器和客户端都绑定到传输 但是当客
  • mkbundle 和 GTK#

    我正在尝试使用 mkbundle 以便我可以分发 GTK 应用程序 而无需用户安装 NET Mono 或 GTK 我已经成功捆绑了一个使用 winforms 的应用程序 但由于某种原因 当我对 GTK 应用程序执行相同操作时 它无法工作 这
  • 在 GtkGrid c 中插入空行

    如何在 GtkGrid 中保留空行 我想创建一个带有按钮的 gtkgrid 如示例所示 0 1 2 3 0 button2 button1 1 button3 2 button4
  • 在 PyGTK 中,显示 PNG 文件的简单方法是什么?

    以下 PyGTK 代码在窗口中显示 PNG 文件 是否有更简单或更好的方式来显示 PNG 文件 例如使用 gtk DrawingArea 例如 如何调整文件大小 import gtk import pygtk pygtk require 2
  • REQ/REP 模式中的 ZeroMQ FiniteStateMachineException

    我有两个简单的组件 它们应该使用 REQ REP ZeroMQ 模式相互通信 服务器 REP Socket 是使用 pyzmq 在 Python 中实现的 import zmq def launch server print Launchi
  • ZeroMQ可以用来接受传统的套接字请求吗?

    我正在尝试使用 ZeroMQ 重写我们的旧服务器之一 现在我有以下服务器设置 适用于 Zmq 请求 using var context ZmqContext Create using var server context CreateSoc
  • ZeroMQ 在 python 多处理类/对象解决方案中挂起

    我正在尝试将 Python pyzmq 中的 ZeroMQ 与多处理一起使用 作为一个最小的 不是 工作示例 我有一个服务器类和一个客户端类 它们都继承自multiprocessing Process 客户端作为子进程应向服务器子进程发送消
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • “WindowsError:[错误 2] 系统找不到指定的文件”未解决

    我已经通过 py2exe 创建了我的 python 项目的 exe 文件 其中有许多文件 当我在系统中运行这个exe文件时 它工作正常 但如果我把它放在另一个系统中 那么它会打开登录表单 然后它不会进入我在第二个 python 文件中编写的
  • 为什么子函数不销毁GtkWindow?

    这是我的代码 void window first void enter window2 GtkWidget w gpointer data void quit GtkWidget w gpointer data void quit int
  • “gi.repository.Gtk”对象没有属性“gdk”

    我正在尝试使用 GTK 创建多线程 需要 Gtk gdk 但我收到有关没有 gdk 属性的错误 我正在使用带有 Raspbian 的 Raspberry Pi 这就是我导入 GTK 库的方式 try import pygtk pygtk r

随机推荐

  • 导出jar后没有声音

    我的应用程序有问题 当我在 Eclipse 中运行应用程序时 声音播放得很好 但如果我将应用程序导出到可运行的 jar 声音就不起作用 方法 播放声音的地方 public static synchronized void playSound
  • 使用 htaccess 重写/重定向,使单个 PHP 文件可以根据 GET/POST 变量显示数据

    请耐心等待我尝试了解有关 htaccess 重定向规则的更多信息 我是一名专业 UI 人员 我正在尽最大努力提高我的编码技能 除 HTML CSS PHP 等之外的语言 所以 我拥有的是一个包含菜单的 index php 文件 非常简单 如
  • 阻止未经所有者许可复制和使用应用程序的最佳方法是什么?

    避免应用程序在所有者不知情的情况下被复制和使用的最佳方法是什么 有什么办法可以追踪使用情况吗 这意味着应用程序会定期进行通信 并提供足够的信息 以便我们知道它在哪里以及是否合法 当然 如果它不合法 下一步就是将其关闭 打电话回家 的软件将很
  • T-SQL 相当于 Excel“MAX”函数,返回两个数字中较大的一个[重复]

    这个问题在这里已经有答案了 可能的重复 SQL Server 中是否有像 NET 中的 Math Max 一样接受两个值的 Max 函数 在 Excel 中 有一个名为 MAX 的函数 它接受数字并返回集合中最大的数字 T SQL 中是否有
  • 带有 XML 架构本地副本的 XML 文件

    我正在尝试一些 XML 架构示例 并且必须使用示例 XML 文件来验证它们 该架构是本地文件 someFile xsd 我正在使用 Eclipse 并且希望在 XML 文件中包含一个引用以指向此本地 xsd 文件 以便 Eclipse 可以
  • IE 10, 11. 如何防止带有占位符的文本输入触发焦点输入事件?

    在 IE 11 中 如果我的电子邮件为空input with a placeholder 然后单击 聚焦 它 input事件正在被触发 有谁知道为什么并且有解决方案吗 因为input值真的没有改变吗 var el document getE
  • JSX 中立即调用的函数表达式

    我正在开发 React 项目 我正在尝试编译但找不到为什么会出现此语法错误 具体来说 模式 gt 在这种情况下正在做什么 Module build failed SyntaxError Unexpected token expected 3
  • 如何用 XML 序列化子类及其基类

    我可以序列化单个类型 类 但是有没有办法也可以序列化它的基类 例如 class B A 在这里我可以序列化 B 类 但是如何序列化 A 类 A必须提前知道 即 XmlInclude typeof B public class A publi
  • 在我的 WPF 应用程序中托管 Windows Shell Explorer

    是否可以将 Windows 资源管理器文件 文件夹浏览器视图嵌入到 WPF 或 WinForms 窗口中 我基本上想将文件 文件夹浏览器作为我的应用程序窗口的一部分托管 我不想重新实现 shell 提供的功能 尤其是像 TortoiseSV
  • 如何使用javascript突出显示文本

    有人可以帮助我使用一个可以突出显示网页上文本的 JavaScript 函数吗 要求是仅突出显示一次 而不是像我们在搜索时那样突出显示所有出现的文本 你可以使用jquery突出效果 但如果您对原始 javascript 代码感兴趣 请看看我得
  • 如何在groovy中添加当前日期的年份或月份?

    如何在groovy脚本中向当前日期添加一年 def Format1 yyyy MM dd def today new Date def currentDate today format Format1 例如 2015年7月29日至2016年
  • 如何在 Firestore 中跨集合查询数据?

    下面的文档中写道 如果需要跨集合查询数据 请使用根级集合 https cloud google com firestore docs data model 如果有人知道在 Firestore 中跨根级集合查询数据的示例 请分享该示例 我不确
  • Java有可索引的多队列线程池吗?

    是否有一个 Java 类 可以通过 id 添加可执行任务 其中具有相同 id 的所有任务保证永远不会同时运行 线程数可以限制为固定数量 简单的 Map 解决方案可以轻松解决 1 但很难管理 2 同样 我所知道的所有线程池类都会从单个队列中提
  • Hadoop 上理想的减速器数量是多少?

    正如 Hadoop wiki 给出的 计算理想的减速器数量是 0 95 或 1 75 节点 mapred tasktracker tasks maximum but 什么时候选择0 95 什么时候选择1 75 决定这个乘数时考虑的因素是什么
  • 将文件从 MVC 5 下载到 Angular 2

    我有 C 后端和 ASP Net MVC 经验 现在我正在第一次尝试 Angular 2 这需要时间 但我喜欢其中的大部分 现在我陷入了简单的文件下载 我已阅读在 Stackoverflow 上找到的所有示例 但我的示例仍然无法运行 在服务
  • .bashrc 语法错误:意外的文件结尾

    我收到意外的文件结束错误 我不太确定如何解决它 Source global definitions if f etc bashrc then etc bashrc fi User specific aliases and functions
  • 如何对 List 进行排序以首先列出目录并按目录对文件进行分组?

    为了获取指定目录中包含的所有文件并根据某些扩展名 我使用以下方法listFiles班级的FileUtils from Apache 公共 IO库 如以下代码示例所示 ArrayList
  • Kendo Grid 滚动到选定的行

    我希望能够调用一个将 Kendo 网格滚动到所选行的函数 我已经尝试过一些方法 但没有一个有效 例如我尝试过这个 var grid Grid data kendoGrid content k grid content content scr
  • 从 SOAP 请求中删除命名空间

    我已导入 WSDL 并使用它来发送 SOAP 请求 它看起来像这样
  • 如何在 GTK/QT/Clutter 应用程序中使用 ZeroMQ?

    In gtk应用程序的所有执行都发生在gtk main功能 其他图形框架作品也有类似的事件循环 例如app exec for QT and clutter main for Clutter 然而ZeroMQ基于以下假设 while 1 它被