[GTK]创建线程,点击按键后开启线程,显示进程ID号和运行的核

—————–pro————————————
INCLUDEPATH += /usr/include/gtk-3.0 \
/usr/include/at-spi2-atk/2.0 \
/usr/include/at-spi-2.0 \
/usr/include/dbus-1.0 \
/usr/lib/x86_64-linux-gnu/dbus-1.0/include \
/usr/include/gtk-3.0 /usr/include/gio-unix-2.0 \
/usr/include/cairo /usr/include/pango-1.0 \
/usr/include/harfbuzz \
/usr/include/pango-1.0 \
/usr/include/fribidi \
/usr/include/harfbuzz \
/usr/include/atk-1.0 \
/usr/include/cairo \
/usr/include/pixman-1 \
/usr/include/uuid \
/usr/include/freetype2 \
/usr/include/gdk-pixbuf-2.0 \
/usr/include/libpng16 \
/usr/include/x86_64-linux-gnu \
/usr/include/libmount \
/usr/include/blkid \
/usr/include/glib-2.0 \
/usr/lib/x86_64-linux-gnu/glib-2.0/include\
/usr/include/

LIBS += -pthread \
-pthread \
-lgtk-3 \
-lgdk-3 \
-lpangocairo-1.0 \
-lpango-1.0 \
-lharfbuzz \
-latk-1.0 \
-lcairo-gobject \
-lcairo \
-lgdk_pixbuf-2.0 \
-lgio-2.0 \
-lgobject-2.0 \
-lglib-2.0 \
-lserialport
SOURCES += \
main.cpp

————————–main.cpp——————————–
#define _GNU_SOURCE
#include
#include
#include // 用于sched_getcpu()

// 更新主界面标签的函数(在主线程中调用)
gboolean update_label(gpointer user_data) {
GtkWidget *label = (GtkWidget *)user_data;

// 获取当前 CPU 核编号
int cpu = sched_getcpu();
gchar *text = g_strdup_printf(“线程在 CPU 核 %d 上运行”, cpu);

gtk_label_set_text(GTK_LABEL(label), text);
g_free(text);

return FALSE; // 返回 FALSE 表示不重复调用
}

// 后台线程函数
gpointer thread_function(gpointer user_data) {
GtkWidget *label = (GtkWidget *)user_data;
while (1)
{
g_print(“后台线程 ID: %p\n”, g_thread_self());

// 模拟耗时任务
g_usleep(2000000); // 休眠2秒

// 任务完成后,使用 g_idle_add 将更新操作发送到主线程
g_idle_add(update_label, label);
}

return NULL;
}

// “开始任务”按钮点击事件的处理函数
void on_button_clicked(GtkButton *button, gpointer user_data) {
GtkWidget *label = (GtkWidget *)user_data;

// 创建一个后台线程来执行任务
g_thread_new(“worker-thread”, thread_function, label);
}

int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);

// 初始化 GTK 界面
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), “GTK 多线程示例”);
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
g_signal_connect(window, “destroy”, G_CALLBACK(gtk_main_quit), NULL);

GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
gtk_container_add(GTK_CONTAINER(window), vbox);

GtkWidget *label = gtk_label_new(“等待任务…”);
gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);

GtkWidget *button = gtk_button_new_with_label(“开始任务”);
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
g_signal_connect(button, “clicked”, G_CALLBACK(on_button_clicked), label);

gtk_widget_show_all(window);
gtk_main();

return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注