QT插件,VTK QT小工具,多线程和链接问题?

时间:2010-09-09 08:44:09

标签: c++ qt4 linker vtk

问候所有人,

这将是一个很长的问题,跳过[背景],如果它不是那个neccasary;)

背景

我正在开发基于模块化QT的应用程序。应用程序可通过基于QT的插件进行扩展。 如图所示,主要有3个部分(红色数字)

alt text

1) libAppCore - 应用程序的核心,它定义了插件接口,主要UIS,interations..etc

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中运行良好。

所有内容编译都很好,我只有在执行使用VTK库的PluginB时才遇到问题。

在执行PluginB期间,它会创建一个QWidget,在QMainWindow中设置为中央窗口小部件。(可以同时存在多个QMainWindow) 在这个QWidget中,我创建了一个QVTWidget并创建了一个虚拟球体,如下所示,

QVTKWidget qtWidget = new QVTKWidget(this);  qtWidget->调整大小(512,512);

vtkSmartPointer sphereSource = vtkSmartPointer :: New();  sphereSource->更新();  vtkSmartPointer sphereMapper = vtkSmartPointer :: New();  sphereMapper-> SetInputConnection(sphereSource-> GetOutputPort());  vtkSmartPointer sphereActor = vtkSmartPointer :: New();  sphereActor-> SetMapper(sphereMapper);

// VTK渲染器  vtkSmartPointer leftRenderer = vtkSmartPointer :: New();  leftRenderer-> AddActor(sphereActor);

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 :(得分:0)

最后我找到了解决方案.. 我已经为Release版本编译了VTK库。但是我构建了Debug版本的所有其他组件。 由于有两个QT库链接(Release和Debug版本),QT为每个版本创建两个线程。 最后,我使用Release构建选项构建所有内容,一切正常。