【问题标题】:How can I g_signal_connect() by ID rather than string name?如何通过 ID 而不是字符串名称来 g_signal_connect()?
【发布时间】:2021-03-02 21:40:57
【问题描述】:

在 GTK 中处理按钮按下的典型方法是:

g_signal_connect(GTK_BUTTON(myButton), "pressed", G_CALLBACK(myButtonHandler), NULL);

但是,我发现使用字符串(例如"pressed")进行内部识别是不好的、缓慢的和不必要的。如果我能找到与此相对应的数字信号 ID,我可以跳过解析步骤。但是如何通过 ID 而不是字符串名称连接事件?我做了很多挖掘,找到了this,我还了解到g_signal_connect是一个扩展为g_signal_connect_data的宏,但是这些都不能完全解决我的问题。

这可能吗,如果可以,我该怎么做?

【问题讨论】:

  • 您的问题到底是什么?解析短字符串,很可能只在启动时解析一次,不应该是一个明显的问题。使用字符串而不是 ID 可以使系统对构建和执行期间使用的不同版本的库具有鲁棒性。
  • @Gerhardh 但是,为什么要使用字符串而不是宏?使用字符串进行识别很糟糕
  • 我刚刚提到了原因。如果您在列表中插入另一个字符串,则字符串不会失败。尝试使用一些枚举作为 ID。
  • @Gerhardh 宏也不会失败
  • 编译器不知道宏。它们被扩展为字符串或 ID。这里没有区别。

标签: c gtk micro-optimization


【解决方案1】:

您可以使用g_signal_connect_closure_by_id(),但您必须创建一个GClosure 结构来保存您的回调和回调数据。

我真的不建议这样做,因为它会将样板添加到您的代码中而没有什么好处。您通常只连接一次信号。如果你在一个紧密的循环中连接一个信号,那么你可能做错了什么,或者你有一个非常不寻常的用例。无论如何,信号名称实际上是被保留的,这意味着您甚至不会产生字符串比较的成本;如果信号具有详细注释,则仅在 : 处拆分字符串的成本。除非它实际上显示为分析器图表上的瓶颈,否则不要费心优化它。

【讨论】:

    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多