如何在 gtkmm 的另一个线程中运行函数?

Posted

技术标签:

【中文标题】如何在 gtkmm 的另一个线程中运行函数?【英文标题】:How to run a function in another thread in gtkmm? 【发布时间】:2021-03-11 18:56:15 【问题描述】:

我想用 gtkmm/glade 制作一个有用的应用程序,我需要将一个简单的按钮信号传递给另一个线程。但不幸的是,我不知道该怎么做。为了更好的演示,我做了一个小软件。这是一个按钮和一个进度条,如果您按下该按钮,进度条就会被填满。如果您修改我的代码以使“ClickInterrupt()”函数在另一个线程中工作,那就太好了。

干杯!

cpp 文件:

#include <iostream>
#include <gtkmm.h>

using namespace std;

Glib::RefPtr<Gtk::ProgressBar>  MyProgressBar;

void ClickInterrupt (void)

    static float value;
    value += 0.2;
    if (value > 1.0) value = 0.0;
    MyProgressBar->set_fraction (value);
    cout << "how do I run this in another thread?" << endl;


int main (int argc,char* argv[])

    auto app = Gtk::Application::create(argc, argv, "org.mylittleapp.uwu");
    Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("mygui.glade");
    auto MainWindow = Glib::RefPtr<Gtk::ApplicationWindow>::cast_dynamic(builder->get_object("ApplicationMain"));
    
    auto MyButton = Glib::RefPtr<Gtk::Button>::cast_dynamic(builder -> get_object("MyButton"));
    MyButton -> signal_clicked().connect(sigc::ptr_fun(&ClickInterrupt));
    
    MyProgressBar = Glib::RefPtr<Gtk::ProgressBar>::cast_dynamic(builder->get_object("Progress"));
    
    app->run(*(MainWindow.get()));

林间空地文件:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
  <requires lib="gtk+" version="3.24"/>
  <object class="GtkApplicationWindow" id="ApplicationMain">
    <property name="can-focus">False</property>
    <property name="title" translatable="yes">N00B :)</property>
    <property name="default-width">200</property>
    <property name="default-height">100</property>
    <property name="icon-name">face-smile-big</property>
    <child>
      <object class="GtkBox">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkProgressBar" id="Progress">
            <property name="visible">True</property>
            <property name="can-focus">False</property>
            <property name="valign">center</property>
            <property name="vexpand">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="MyButton">
            <property name="label" translatable="yes">Fill the Progressbar</property>
            <property name="visible">True</property>
            <property name="can-focus">True</property>
            <property name="receives-default">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

【问题讨论】:

可以this帮忙吗? 是的,很有帮助。但我想确定一下,请编辑我的代码。 我在下面发布了文档。很遗憾,如果您没有研究可显示(例如:试用代码、具体问题等),我无法为您提供帮助。 【参考方案1】:

在python中,这里有一些东西:将GUI按钮按下传递给该GUI中控制倒计时的线程。也许类似的可以在 c 中完成。由于我对c不熟悉,我不能给你精确的c代码。 https://github.com/f4iteightiz/UWR_scoreboard

【讨论】:

【参考方案2】:

official documentation (Gtkmm 3.24) 有一个nice example,进度条由一个按钮更新。基本上,Glib::Dispatcher 就是您要查找的内容。

其他版本的Gtkmm,见this page

【讨论】:

以上是关于如何在 gtkmm 的另一个线程中运行函数?的主要内容,如果未能解决你的问题,请参考以下文章

从qt中的另一个线程运行qtconcurrent时如何关闭程序

有一个返回 int 的函数,我如何使用 boost 在单独的线程中运行它?

如何使用信号调用同一进程中的另一个线程在轮询函数上休眠的进程而不杀死它?

在 .Net Core 的另一个线程上调用函数

为啥 gtkmm 有时会自动创建第二个线程?

如何通过 PySide 上的另一个线程从 QMainWindow 类中捕获信号?