QT Plugin, VTK QT Widget, Multi-Thread и Linking вопрос? - PullRequest
1 голос
/ 09 сентября 2010

Приветствую всех,

Это будет длинный вопрос, пропустите [Фон], если это не так необходимо;)

[Фон ]

Я занимаюсь разработкой модульного приложения на основе QT. Приложение расширяемо с помощью плагинов на основе QT.Как показано на рисунке, в основном это 3 части. (Цифры красным цветом)

alt text

1) libAppCore - ядро ​​приложения, которое определяетвнешние интерфейсы, основные UIS, взаимодействия .. и т. д.

2) App.exe - приложение, реализующее некоторые встроенные плагины и выполнение основного приложения.

3) Плагины на основе Qt - несколько плагинов, которые реализуют интерфейсы плагинов в libAppCore.dll

Вот как каждый компонент связывает друг друга:

  • libAppCore связывает библиотеки QT.

  • App.exe связывает библиотеки libAppCore.DLL и QT (App.exe использует некоторые другие классы QT, которые не используются, моя libAppCore.DLL)

  • Плагины (libAppQTPluginA.DLL, libAppQTPluginB.DLL) - связывает libAppCore.DLL и библиотеки QT.libAppQTPluginA.DLL - ссылки OpenGL libAppQTPluginB.DLL - ссылки библиотек VTK

[Актуальная проблема;] Опять же происходит только в Windows, отлично работает в Linux.

Все отлично компилируется, и у меня есть только проблема при выполнении PluginB, который использует библиотеки VTK.

Во время выполнения PluginB онсоздает QWidget, который устанавливается как центральный виджет в QMainWindow. (может быть много QMainWindow одновременно). Внутри этого QWidget я создаю QVTWidget и создаю фиктивную сферу следующим образом:

QVTKWidget qtWidget = new QVTKWidget (this);qtWidget-> resize (512, 512);

vtkSmartPointer сфереSource = vtkSmartPointer :: New ();sphereSource-> Обновить ();vtkSmartPointerphereMapper = vtkSmartPointer :: New ();sphereMapper-> SetInputConnection (sphereSource-> GetOutputPort ());vtkSmartPointerphereActor = vtkSmartPointer :: New ();globeActor-> SetMapper (phereMapper);

// Визуализация VTK vtkSmartPointer leftRenderer = vtkSmartPointer :: New ();leftRenderer-> AddActor (phereActor);

qtWidget-> GetRenderWindow () -> AddRenderer (leftRenderer);QVBoxLayout * vboxLayout = new QVBoxLayout;vboxLayout-> addWidget (qtWidget);setLayout (vboxLayout);

Во время выполнения QT предупреждает о нескольких потоках, но я никогда не создаю ни новых потоков, ни VTK (AFAIK).

QObject: Cannot create children for a parent that is in a different thread.(Parent is QObject(0xdbe0d70), parent's thread is QThread(0x3370f8), current thread is QThread(0xdc427f8)

(Но когда я закомментирую строку vboxLayout-> addWidget (qtWidget); это исчезает.)

И когда я выполняю какую-либо операцию с QVTKWidget, происходит сбой приложения. Журнал ошибок равен

> Program received signal SIGSEGV,
> Segmentation fault. 0x01024c41 in
> QRegion::isEmpty (this=0x28d480) at
> painting\qregion.cpp:3975 3975   
> painting\qregion.cpp: No such file or
> directory.
>         in painting\qregion.cpp (gdb) back
> #0  0x01024c41 in QRegion::isEmpty (this=0x28d480)
>     at painting\qregion.cpp:3975
> #1  0x00f0f18a in QWidgetPrivate::childAt_helper
> (this=0xf3957a0, p=...,
>     ignoreChildrenInDestructor=false) at kernel\qwidget.cpp:9641
> #2  0x00f0f109 in QWidgetPrivate::childAt_helper
> (this=0xb3c8218, p=...,
>     ignoreChildrenInDestructor=false) at kernel\qwidget.cpp:9636
> #3  0x00f0ef9e in QWidget::childAt (this=0x3be0b0, p=...)
>     at kernel\qwidget.cpp:9600
> #4  0x00f27bb6 in QETWidget::translateMouseEvent
> (this=0xf3701e8, msg=...)
>     at kernel\qapplication_win.cpp:3114
> #5  0x00f234db in QtWndProc@16 (hwnd=0x70af4, message=513, wParam=1,
>     lParam=14090539) at kernel\qapplication_win.cpp:1629
> #6  0x767a6238 in USER32!IsDialogMessageW ()    from
> C:\Windows\syswow64\user32.dll
> #7  0x00070af4 in ?? () warning: (Internal error: pc 0x200 in read in
> psymtab, but not in symtab.)
> 
> warning: (Internal error: pc 0x200 in
> read in psymtab, but not in symtab.)
> 
> #8  0x00000201 in ?? (warning: (Internal error: pc 0x200 in read in
> psymtab, but  not in symtab.)

Любые советы?Почему он объединяет несколько потоков в первый раз?

1 Ответ

0 голосов
/ 10 сентября 2010

Наконец я нашел решение .. Я скомпилировал библиотеки VTK для версии Release. Но все остальные компоненты я собираю версию Debug. Поскольку есть две библиотеки QT, связанные (версия выпуска и отладки), QT создает два потока для каждой версии. Наконец я собираю все с опцией Release build, и все работает нормально.

...