jauri
5th November 2012, 18:31
Thanks in advance for any help you can provide!! :)
When running my program in Debug mode on MacOSX 10.8.1 Qt 4.8 I get the following messages:
------
QObject::moveToThread: Current thread (0x101400f00) is not the object's thread (0x10b9f2ee0).
Cannot move to target thread (0x114b85c00)
On Mac OS X, you might be loading two sets of Qt binaries into the same process. Check that all plugins are compiled against the right Qt binaries. Export DYLD_PRINT_LIBRARIES=1 and check that only one set of binaries are being loaded.
------
I am using multi-threaded programming, which may be part of the problem, but I can't sort out how the problems with 'moveToThread' relate to the problems with loading two sets of Qt binaries.
I am not using any pluggins, which appears to have been the problem in related threads:
http://www.qtcentre.org/threads/38206-Qt-4-7-Mac-OS-X-Might-be-loading-two-sets-of-Qt-binaries-into-the-same-process
-------
Threading:
I have a QObject holds a QList of QPointers to custom QGraphicsWidgets and then contains a function called 'process' that positions and sizes these custom widgets.
class VisBaseLayout : public QObject
{
Q_OBJECT
public:
VisBaseLayout(QObject *parent = 0);
VisBaseLayout(QList< QPointer< VisBaseElement > > elements, QObject *parent = 0);
void addElement( QPointer< VisBaseElement > e );
void addElements( QList< QPointer <VisBaseElement> > e );
signals:
void trackProgress(int stepsComplete);
void finished();
void error( QString err );
public slots:
virtual void process();
protected:
QList< QPointer < VisBaseElement > > elementsToLayout;
};
I create the layout in a manager object, and then call 'runLayout' to position the elements. The elements have been created in the main GUI thread, and no paint events are signaled in the layout object.
To run the layout I call:
void LayoutManager::runLayout()
{
QThread* thread = new QThread;
layout->moveToThread(thread);
connect(thread, SIGNAL(started()), layout, SLOT(process())); //once thread launched, begin processing
connect(layout, SIGNAL(finished()), thread, SLOT(quit()));//quit thread once layout is finished
connect(layout, SIGNAL(finished()), this, SLOT(callUpdate())); //once finsished, delete layout
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));//once finished, delete thread
thread->start();
}
This has been working, but I noticed the errors when I started calling this function again, in response to user changes in layout.
void LayoutManager::recomputeLayoutSlot()
{
runLayout();
}
-----------------
Loading 2 sets of Qt Binaries in the same process:
I followed instructions and set DYLD_PRINT_LIBRARIES=1 and I get a lengthy output of dylds, which I cannot post in full due to post-length restrictions. Here is a sample:
dyld: loaded: PathTo/build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Debug/MyApp.app/Contents/MacOS/MyApp
dyld: loaded: PathTo/QtSDK/Desktop/Qt/4.8.0/gcc/lib/QtGui.framework/Versions/4/QtGui
dyld: loaded: PathTo/QtSDK/Desktop/Qt/4.8.0/gcc/lib/QtCore.framework/Versions/4/QtCore
dyld: loaded: /usr/lib/libstdc++.6.dylib
dyld: loaded: /usr/lib/libSystem.B.dylib
dyld: loaded: /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon
dyld: loaded: /usr/lib/libz.1.dylib
dyld: loaded: /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit
dyld: loaded: /usr/lib/libobjc.A.dylib
dyld: loaded: /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices
dyld: loaded: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices
dyld: loaded: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
dyld: loaded: /usr/lib/system/libcache.dylib
dyld: loaded: /usr/lib/system/libcommonCrypto.dylib
dyld: loaded: /usr/lib/system/libcompiler_rt.dylib
dyld: loaded: /usr/lib/system/libcopyfile.dylib
dyld: loaded: /usr/lib/system/libdispatch.dylib
dyld: loaded: /usr/lib/system/libdnsinfo.dylib
dyld: loaded: /usr/lib/system/libdyld.dylib
dyld: loaded: /usr/lib/system/libkeymgr.dylib
dyld: loaded: /usr/lib/system/liblaunch.dylib
dyld: loaded: /usr/lib/system/libmacho.dylib
dyld: loaded: /usr/lib/system/libquarantine.dylib
dyld: loaded: /usr/lib/system/libremovefile.dylib
dyld: loaded: /usr/lib/system/libsystem_blocks.dylib
dyld: loaded: /usr/lib/system/libsystem_c.dylib
dyld: loaded: /usr/lib/system/libsystem_dnssd.dylib
dyld: loaded: /usr/lib/system/libsystem_info.dylib
dyld: loaded: /usr/lib/system/libsystem_kernel.dylib
dyld: loaded: /usr/lib/system/libsystem_m.dylib
dyld: loaded: /usr/lib/system/libsystem_network.dylib
dyld: loaded: /usr/lib/system/libsystem_notify.dylib
dyld: loaded: /usr/lib/system/libsystem_sandbox.dylib
dyld: loaded: /usr/lib/system/libunc.dylib
dyld: loaded: /usr/lib/system/libunwind.dylib
dyld: loaded: /usr/lib/system/libxpc.dylib
dyld: loaded: /usr/lib/system/libcorecrypto.dylib
dyld: loaded: /usr/lib/libauto.dylib
dyld: loaded: /usr/lib/libc++abi.dylib
dyld: loaded: /usr/lib/libc++.1.dylib
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics
dyld: loaded: /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText
dyld: loaded: /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSync.framework/Versions/A/ColorSync
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD
...... many more .......
When running my program in Debug mode on MacOSX 10.8.1 Qt 4.8 I get the following messages:
------
QObject::moveToThread: Current thread (0x101400f00) is not the object's thread (0x10b9f2ee0).
Cannot move to target thread (0x114b85c00)
On Mac OS X, you might be loading two sets of Qt binaries into the same process. Check that all plugins are compiled against the right Qt binaries. Export DYLD_PRINT_LIBRARIES=1 and check that only one set of binaries are being loaded.
------
I am using multi-threaded programming, which may be part of the problem, but I can't sort out how the problems with 'moveToThread' relate to the problems with loading two sets of Qt binaries.
I am not using any pluggins, which appears to have been the problem in related threads:
http://www.qtcentre.org/threads/38206-Qt-4-7-Mac-OS-X-Might-be-loading-two-sets-of-Qt-binaries-into-the-same-process
-------
Threading:
I have a QObject holds a QList of QPointers to custom QGraphicsWidgets and then contains a function called 'process' that positions and sizes these custom widgets.
class VisBaseLayout : public QObject
{
Q_OBJECT
public:
VisBaseLayout(QObject *parent = 0);
VisBaseLayout(QList< QPointer< VisBaseElement > > elements, QObject *parent = 0);
void addElement( QPointer< VisBaseElement > e );
void addElements( QList< QPointer <VisBaseElement> > e );
signals:
void trackProgress(int stepsComplete);
void finished();
void error( QString err );
public slots:
virtual void process();
protected:
QList< QPointer < VisBaseElement > > elementsToLayout;
};
I create the layout in a manager object, and then call 'runLayout' to position the elements. The elements have been created in the main GUI thread, and no paint events are signaled in the layout object.
To run the layout I call:
void LayoutManager::runLayout()
{
QThread* thread = new QThread;
layout->moveToThread(thread);
connect(thread, SIGNAL(started()), layout, SLOT(process())); //once thread launched, begin processing
connect(layout, SIGNAL(finished()), thread, SLOT(quit()));//quit thread once layout is finished
connect(layout, SIGNAL(finished()), this, SLOT(callUpdate())); //once finsished, delete layout
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));//once finished, delete thread
thread->start();
}
This has been working, but I noticed the errors when I started calling this function again, in response to user changes in layout.
void LayoutManager::recomputeLayoutSlot()
{
runLayout();
}
-----------------
Loading 2 sets of Qt Binaries in the same process:
I followed instructions and set DYLD_PRINT_LIBRARIES=1 and I get a lengthy output of dylds, which I cannot post in full due to post-length restrictions. Here is a sample:
dyld: loaded: PathTo/build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Debug/MyApp.app/Contents/MacOS/MyApp
dyld: loaded: PathTo/QtSDK/Desktop/Qt/4.8.0/gcc/lib/QtGui.framework/Versions/4/QtGui
dyld: loaded: PathTo/QtSDK/Desktop/Qt/4.8.0/gcc/lib/QtCore.framework/Versions/4/QtCore
dyld: loaded: /usr/lib/libstdc++.6.dylib
dyld: loaded: /usr/lib/libSystem.B.dylib
dyld: loaded: /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon
dyld: loaded: /usr/lib/libz.1.dylib
dyld: loaded: /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit
dyld: loaded: /usr/lib/libobjc.A.dylib
dyld: loaded: /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices
dyld: loaded: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices
dyld: loaded: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
dyld: loaded: /usr/lib/system/libcache.dylib
dyld: loaded: /usr/lib/system/libcommonCrypto.dylib
dyld: loaded: /usr/lib/system/libcompiler_rt.dylib
dyld: loaded: /usr/lib/system/libcopyfile.dylib
dyld: loaded: /usr/lib/system/libdispatch.dylib
dyld: loaded: /usr/lib/system/libdnsinfo.dylib
dyld: loaded: /usr/lib/system/libdyld.dylib
dyld: loaded: /usr/lib/system/libkeymgr.dylib
dyld: loaded: /usr/lib/system/liblaunch.dylib
dyld: loaded: /usr/lib/system/libmacho.dylib
dyld: loaded: /usr/lib/system/libquarantine.dylib
dyld: loaded: /usr/lib/system/libremovefile.dylib
dyld: loaded: /usr/lib/system/libsystem_blocks.dylib
dyld: loaded: /usr/lib/system/libsystem_c.dylib
dyld: loaded: /usr/lib/system/libsystem_dnssd.dylib
dyld: loaded: /usr/lib/system/libsystem_info.dylib
dyld: loaded: /usr/lib/system/libsystem_kernel.dylib
dyld: loaded: /usr/lib/system/libsystem_m.dylib
dyld: loaded: /usr/lib/system/libsystem_network.dylib
dyld: loaded: /usr/lib/system/libsystem_notify.dylib
dyld: loaded: /usr/lib/system/libsystem_sandbox.dylib
dyld: loaded: /usr/lib/system/libunc.dylib
dyld: loaded: /usr/lib/system/libunwind.dylib
dyld: loaded: /usr/lib/system/libxpc.dylib
dyld: loaded: /usr/lib/system/libcorecrypto.dylib
dyld: loaded: /usr/lib/libauto.dylib
dyld: loaded: /usr/lib/libc++abi.dylib
dyld: loaded: /usr/lib/libc++.1.dylib
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics
dyld: loaded: /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText
dyld: loaded: /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSync.framework/Versions/A/ColorSync
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore
dyld: loaded: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD
...... many more .......