问候所有人,
这将是一个很长的问题,跳过[背景],如果它不是那个neccasary;)
背景
我正在开发基于模块化QT的应用程序。应用程序可通过基于QT的插件进行扩展。 如图所示,主要有3个部分(红色数字)
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.)
任何提示?为什么它第一次得到多线程?
答案 0 :(得分:0)
最后我找到了解决方案.. 我已经为Release版本编译了VTK库。但是我构建了Debug版本的所有其他组件。 由于有两个QT库链接(Release和Debug版本),QT为每个版本创建两个线程。 最后,我使用Release构建选项构建所有内容,一切正常。