【问题标题】:Gtk and C - Multi-threaded GUI Application and Removing Global VariablesGtk 和 C - 多线程 GUI 应用程序和删除全局变量
【发布时间】:2014-02-20 23:31:05
【问题描述】:

我有来自 [1] 的示例 GTK C 应用程序按预期构建和工作。我有一个非常小的 UI 应用程序,带有一个 +- 按钮来增加/减少存储在全局变量中的值,并在应用程序中以文本标签的形式呈现它。

我很少使用 GUI 应用程序,而且我 99% 的工作都是用 C 语言完成的。关于整理这个示例并将其用作项目的基础,我有两个关键问题。

  • 是否有可能替代全局变量,例如 自定义struct 我在main() 中创建,并且有每个回调处理程序引用 通过更改increase() 的功能协议?

代码:

// Can this function protocol be modified?
void increase(GtkWidget *widget, gpointer label) {
  count++;
  sprintf(buf, "%d", count);
  gtk_label_set_text(GTK_LABEL(label), buf);
}
g_signal_connect(minus, "clicked", G_CALLBACK(decrease), label);
  • 是否有创建单独线程来帮助管理 GUI 的简单方法?例如,如果我有一个按钮绑定/连接到一个需要一分钟才能完成的功能,是否有一种普遍接受的方法来触发单独的pthread,它允许我有一个按钮或命令来取消操作,而不是整个 UI 应用都被阻止一分钟?

谢谢。

参考文献


  1. 为 Raspberry Pi 交叉编译 GTK 应用程序,于 2014 年 2 月 20 日访问,<http://hertaville.com/2013/07/19/cross-compiling-gtk-applications-for-the-raspberry-pi/>

【问题讨论】:

  • 原来label 参数是额外的数据指针。我刚刚创建了一个指向结构的指针来代替label,并将函数协议更改为void increase(GtkWidget *widget, gpointer myStruct_t)

标签: c gtk pthreads


【解决方案1】:

是的,您可以将任何您喜欢的作为最后一个参数传递给信号处理程序(gpointer 是 void* 的 typedef)只需在main() 中创建包含标签小部件和计数器变量的结构,将其作为最后一个参数传递到 g_signal_connect 并将其转换回回调中的正确类型。

为了在另一个线程中运行计算并将结果传递给 gtk 主循环,我会查看GTask,尤其是g_task_run_in_thread_async

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多