微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我想用 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()));
}

glade 文件

<?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>

解决方法

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

,

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

对于其他版本的 Gtkmm,请参阅 this page

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。