1

大家好,

这将是一个很长的问题,如果不是那么必要,请跳过 [背景] ;)

[背景]

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

替代文字

1) libAppCore - 应用程序的核心,它定义了plugininterfaces、main 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->resize(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.)

有小费吗 ?为什么它第一次涉及多线程?

4

1 回答 1

0

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

于 2010-09-10T05:22:31.647 回答