Что это говорит о жести.
Qt 5.x прекрасно работает в Windows (несмотря на предупреждающее сообщение консоли), но задыхается от перекраски в Linux и, очевидно, всего, что основано на Какао (которое я никогда не использовал) душит себя, если вы помещаете цикл событий GUI вне Основная тема.
Итак, есть ли что-нибудь, что может надежно обрабатывать цикл «не создается / не имеет своего события» в главном потоке в Windows и Linux (и, может быть, в Mac, но это выглядит как длинный снимок)?
Основой здесь является то, что у меня есть DLL / SO, которую я хочу использовать через tclsh, и я хочу, чтобы эта DLL / SO предоставляла графический интерфейс. я Можно возиться с созданными SWIG обертками, чтобы получить основной интерпретатор и запустить что-то оттуда, но возиться с этим кажется большой проблемой. Я немного поэкспериментировал с Tk, но даже после вызова Tk_Init возвращается Tk_MainWindow NULL
на интерпретаторе в созданном потоке (переводчик также был создан в этом потоке). Кодовое положение по запросу.
РЕДАКТИРОВАТЬ: код. Все это запускается в отдельном потоке, созданном после загрузки DLL / SO через load <libname>.so
в tclsh
,
Tcl_Interp* interp = Tcl_CreateInterp();
Tcl_AppInit(interp); // added on suggestion - all results the same so far
Tk_Init(interp);
/* GDB reveals 'interp->resultDontUse' to be blank here.
Return value of the above statement is 1 (TCL_ERROR) */
Tk_Window main_window = Tk_MainWindow(interp);
// main_window is NULL here, and thus the following line fails miserably
Tk_Window canvas = Tk_CreateWindow(interp, main_window, "gfx", NULL);
while(true) {
{ ... }
Tcl_DoOneEvent(TCL_DONT_WAIT);
}
Tcl_DeleteInterp(interp);
Нотабене Я все еще в порядке с переключением библиотек. Если есть библиотека, для которой оригинальный вопрос работает, и вышеупомянутое не может быть выполнено, я бы переключился.
ОБНОВИТЬ
Tcl / Tk, по-видимому, отлично справляется с тем, что находится в неосновном потоке. По крайней мере, лучше, чем Qt. Спасибо!
Правильно, поскольку на этот вопрос были даны ответы в комментариях, я перехожу к ответу.
Да, библиотека Tk GUI прекрасно справляется, находясь вне основного потока. Проблема, с которой вы столкнулись, заключалась в том, что ваша инициализация не удалась (из-за несоответствия версий, по вашим словам), и поскольку вы не проверяли результат должным образом, вы не замечали ошибку.
Других решений пока нет …