You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于在GtkAlertDialog中使用GCancellable的实用场景疑问

关于在GtkAlertDialog中使用GCancellable的实用场景疑问

我太懂这种啃完文档却找不到实际用法的憋屈了!咱先把GCancellable在GtkAlertDialog里的核心作用说透:它不是给用户手动点取消按钮用的(那是对话框本身的按钮逻辑),而是让你从代码层面主动取消还没被用户关闭的对话框——比如超时自动关闭、程序状态变化时强制关闭这类场景。

给你举几个实打实的实用场景,再结合你的代码改改示例,你一看就明白:

1. 超时自动取消对话框

比如你弹出确认框后,用户5秒没操作,就自动取消这个对话框,不用傻等用户手动点。咱可以这么改你的代码:

#include "g-cancellable.h"

GCancellable *g_cancel = NULL; // 可以存在上下文或全局变量里

void presst(GObject* quelle, GAsyncResult* res, gpointer user_data)
{
      GtkAlertDialog *dialog = GTK_ALERT_DIALOG(quelle);
      GError *err = NULL;
      int button = gtk_alert_dialog_choose_finish (dialog, res, &err);

     if (err) 
     {
                g_print("An error occured!\n");
                g_print("Error Message: %s\n", err->message);
                // 捕获代码主动取消的错误类型
                if (g_error_matches(err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
                    g_print("对话框被程序主动取消了!\n");
                }
                g_free(err);
                g_object_unref(g_cancel);
                return;
     }

     if (button == 1) 
        g_print("Cancel\n");
     if (button == 0)
        g_print("O.k.\n");
      
    g_object_unref(dialog);
    g_object_unref(g_cancel);
}

// 超时触发的取消函数
gboolean timeout_cancel(gpointer data) {
    g_cancellable_cancel(g_cancel);
    return G_SOURCE_REMOVE;
}

void clicked (GtkWidget *button, gpointer user_data)
{
    GtkAlertDialog *dialog = gtk_alert_dialog_new("提示", "你确定要执行这个操作吗?", NULL, NULL);
    g_cancel = g_cancellable_new();
    // 设置5秒超时自动取消
    g_timeout_add(5000, timeout_cancel, NULL);
    // 异步调用时传入cancellable实例
    gtk_alert_dialog_choose(dialog, NULL, g_cancel, presst, NULL);
}

这个例子里,对话框弹出5秒后,g_cancellable_cancel()会触发取消逻辑,presst函数里会捕获到G_IO_ERROR_CANCELLED的错误,这时候你就能处理超时取消的后续逻辑了。

2. 程序状态变化时取消对话框

比如你的程序正在后台下载文件,弹出了“是否暂停下载”的确认框,但突然下载完成了,这时候你就可以调用g_cancellable_cancel()主动取消这个对话框——毕竟下载都结束了,暂停操作也没意义了,总不能让用户对着一个无效对话框发呆吧。

3. 批量操作中的全局取消

如果你的程序在批量处理多个文件,每个文件都要弹出确认框,这时候你可以用同一个GCancellable实例绑定所有对话框。当用户点击全局的“取消所有操作”按钮时,只要调用一次g_cancellable_cancel(),就能把所有待处理的对话框都取消掉,不用一个个去单独处理,效率高多了。

回到你原来的代码,你之前只处理了用户手动点击对话框按钮的情况,加入GCancellable后,就能覆盖那些不需要用户手动操作、程序主动干预的场景啦。

备注:内容来源于stack exchange,提问作者Holger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 11:48:07