如何解决如何在 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 举报,一经查实,本站将立刻删除。