c++ - 是否可以“加入” gtk-event-loop
问题描述
gtk4 删除了以下的阻塞行为GtkDialogs
:
int res = gtk_dialog_run(GTK_DIALOG(dialog));
建议的替代方法是使对话框模态并连接"response"
信号。但这有一个很大的缺点:一些旧代码库具有线性和确定性的 CFG。仅更改调用和处理所有对话框的方式会导致这样一个事实,即如果在外部范围中预期对话的处理,则离开范围后代码可能是错误的。
为了避免这种情况,我使用了std::promise
,std::future
但这会阻止 gtk-event 循环:/。
我提出的解决方案是,“加入” gtk-event-loop,直到结果准备好。这将具有两种方法的优点:“不要停止世界”/处理事件循环并保持线性 CFG。但它有一个缺点,即在递归调用连接时可能导致堆栈溢出或饥饿。
建议/搜索解决方案的伪代码:
auto future_result = generate_future_for_dialog_result(dialog);
while(!future_result.isDone()){
g_join();
}
我的第一个不工作的方法:
auto wait_for_gtk_dialog_result =
[](GtkDialog* dialog) {
std::promise<int> promise;
auto future = promise.get_future();
g_signal_connect(dialog, "result",
GCallback(+[](GtkDialog* /*self*/, int result, std::promise<int>* promise) {
promise->set_value(result);
}),
&promise);
return future.get();
};
有加入事件循环的功能吗?
如果不; 有没有实现类似的好选择?
编辑:在文档中找到了一种有前途的方法:查看g_main_context_iteration
.
auto wait_for_gtk_dialog_result =
[](GtkDialog* dialog) {
std::promise<int> promise;
auto future = promise.get_future();
g_signal_connect(dialog, "result",
GCallback(+[](GtkDialog* /*self*/, int result, std::promise<int>* promise) {
promise->set_value(result);
}),
&promise);
do {
g_main_context_iteration(g_main_context_default(), false);
} while (future.wait_for(std::chrono::milliseconds(1)) != std::future_status::ready);
return future.get();
};
解决方案
推荐阅读
- powerquery - 如何设置查询的源名称是另一个查询的值?
- apache-kafka - KTable 外键连接与 avro 模式注册表不兼容
- android - 伴随对象中的 val arrayListOf() 返回无效值
- python - 获取错误绑定参数 0 - 使用构造函数创建对象时可能不支持的类型
- python - 为什么这不能正确提取价格?每个价格都为0?它还说在定义之前就引用了“付款”?
- mysql - MySQL外键约束不兼容
- javascript - 在数组中添加新对象
- linux - 我使用 pip 在 linux 上安装了 pygame,但是当尝试在 VS Code 中导入它时,它说没有名为“pygame”的模块。我该如何解决这个问题?
- javascript - ANTLR4 javascript 访问者中的 ctx
- javascript - 获取当前正在播放 youtube 视频的频道名称