Domanda

Un saluto tutti,

Questa sarà una lunga domanda, saltare la [sfondo] se non quello neccasary;)

[Sfondo ]

Sto sviluppando un application.Application modulare basata QT è extentible attraverso i plugin basati su QT. Come mostrato nella figura, vi sono principalmente 3 parti. (Numeri in rosso)

alt text

1) libAppCore - il nucleo dell'applicazione, che definisce pluginterfaces, UIS principale, interations..etc

2) App.exe -. L'applicatoin che attuano alcuni plugin incorporati ed esecuzione principale

3) a base di Qt plugin - diversi plugin che implementa Plugin interfacce in libAppCore.dll

Ecco come ogni componente link tra loro:

  • libAppCore collega le librerie QT.

  • App.exe collega libAppCore.DLL e librerie QT (App.exe utilizza someother classi Qt non in uso il mio libAppCore.DLL)

  • Plugin (libAppQTPluginA.DLL, libAppQTPluginB.DLL) - link libAppCore.DLL e QT librerie. libAppQTPluginA.DLL - collega OpenGL libAppQTPluginB.DLL - link VTK librerie

[Problema effettivo; ] Anche in questo caso si verifica solo in Windows, funziona bene in Linux.

Tutto compila bene e ho solo problema wihen esecuzione del PluginB, che utilizza le librerie VTK.

Durante l'esecuzione PluginB, crea un QWidget quale set di widget di centrale in un QMainWindow. (Ci possono essere molti QMainWindow di in una sola volta) All'interno di questo QWidget creo un QVTWidget e creare una sfera manichino come segue,

QVTKWidget qtWidget = new QVTKWidget (questo);  qtWidget-> ridimensionamento (512, 512);

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

// VTK renderer  vtkSmartPointer leftRenderer = vtkSmartPointer :: New ();  leftRenderer-> AddActor (sphereActor);

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

Durante l'esecuzione QT mette in guardia su più thread, ma non ho mai crea nuove discussioni né 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)

(Ma quando io commento la linea vboxLayout-> addWidget (qtWidget);. Questo scompare)

E quando per forza qualsiasi operazione su QVTKWidget, crash dell'applicazione registro .Error è

> 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.)

Qualche consiglio? Perché Compains sulla filettatura a più alla prima volta?

È stato utile?

Soluzione

Finalmente ho trovato la soluzione .. Avevo compilato le librerie VTK per uscita version.But tutti gli altri componenti che costruiscono versione di debug. Poiché ci sono due librerie QT sono collegate (Release e Debug versione), QT creare due thread per ogni versione. Infine costruisco tutta l'opzione di uscita di compilazione con e tutto funziona bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top