尝试从Qt应用程序运行Gtk +时,我遇到了麻烦。
为了澄清背景,我(与Jan Wielemaker一起)写了一些Qt的东西 便携式SWI-Prolog console。
事实证明它有点复杂,主要是因为SWI-Prolog有自己的线程管理,我有可能实例化多个控制台,可以运行自己的线程。 ..当然,GUI必须同步。也许我没有采取更好的实施途径 - 现在我推测 - 可以使用虚拟tty(forkpty和朋友)......
最近,一个有趣的包已经发布,PLGI,可以构建基于GObject的应用程序。
从swipl可执行文件启动时效果很好,但从swipl-win运行时崩溃。
最小的例子(显然需要PLGI,而这至少需要SWI-Prolog 7.3版,所以用?- pack_install(plgi).
执行包安装)
#include <QApplication>
#include <SWI-cpp.h>
#include "mainwindow.h"
#include <QTimer>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
PlEngine e(argc, argv);
QTimer::singleShot(5000, []() {
printf("inside\n");
int rc = PlCall("consult('/home/carlo/lib/swipl/pack/plgi/examples/00-simple-example')");
printf("result %d\n", rc);
});
printf("after\n");
MainWindow w;
w.show();
return a.exec();
}
过程输出:
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.6-17-g243e698-DIRTY)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.
For help, use ?- help(Topic). or ?- apropos(Word).
(use_plgi:2644): GLib-GObject-WARNING **: cannot register existing type 'GdkDisplayManager'
(use_plgi:2644): GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed
(use_plgi:2644): GLib-GObject-CRITICAL **: g_object_new: assertion 'G_TYPE_IS_OBJECT (object_type)' failed
当然,Qt控制台应用程序可以运行:
#include <QCoreApplication>
#include <SWI-cpp.h>
#include <QTimer>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
PlEngine e(argc, argv);
printf("before\n");
QTimer::singleShot(1000, []() {
printf("inside\n");
int rc = PlCall("consult('/home/carlo/lib/swipl/pack/plgi/examples/00-simple-example')");
printf("result %d\n", rc);
});
printf("after\n");
return a.exec();
}
从我读到的关于错误的内容
(use_plgi:2644): GLib-GObject-WARNING **: cannot register existing type 'GdkDisplayManager'
似乎消息队列无法正常工作,我一直无法追查问题。有可用的提示吗?