• 7937阅读
  • 4回复

多线程的问题,求助! [复制链接]

上一主题 下一主题
离线mendynew
 
只看楼主 正序阅读 楼主  发表于: 2008-10-31
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
使用了Qt的graphics view画图。因为涉及到大量item,所以采用了多线程机制。即开辟了一个新线程A创建item并且加到scene里,这里scene是由主线程创建。线程A执行完毕后,触发主线程的slot再讲scene加到对应的QGraphicsView里。
程序在4.2.2编译下运行一切正常,但是换到4.4.0平台后,出现了运行时错误。
如果改用单线程则没有问题,所以估计是多线程引起的内存错误。
BTW:显示全部在主线程中。新线程中不涉及显示。
以下是断点触发时的调用堆栈

    ntdll.dll!7c901230()    
    [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]   
    ntdll.dll!7c96c943()    
    ntdll.dll!7c96cd80()    
    ntdll.dll!7c960af8()    
>    msvcp80d.dll!std::char_traits<char>::_Copy_s(char * _First1=0x0001eedc, unsigned int _Size_in_bytes=79424784, const char * _First2=0x104fef1d, unsigned int _Count=79425020)  Line 575 + 0x16 bytes    C++
    msvcr80d.dll!unaligned_memcmp(const unsigned char * bLHS=0x7c85e9cf, const unsigned char * bRHS=0x01880000, unsigned int siz=1073741920)  + 0x3a3 bytes    C
    04bbed74()   
    msvcr80d.dll!_CrtIsValidHeapPointer(const void * pUserData=0x0431b188)  Line 2072    C++
    msvcr80d.dll!realloc_help(void * pUserData=0x0431b188, unsigned int * pnNewSize=0x04bbee18, int nBlockUse=1, const char * szFileName=0x00000000, int nLine=0, int fRealloc=1)  Line 713 + 0x9 bytes    C++
    msvcr80d.dll!_realloc_dbg(void * pUserData=0x0431b188, unsigned int nNewSize=32, int nBlockUse=1, const char * szFileName=0x00000000, int nLine=0)  Line 973 + 0x1b bytes    C++
    msvcr80d.dll!realloc(void * pUserData=0x0431b188, unsigned int nNewSize=32)  Line 883 + 0x13 bytes    C++
    QtCored4.dll!qRealloc(void * ptr=0x0431b188, unsigned int size=32)  Line 45 + 0xe bytes    C++
    QtCored4.dll!QListData::realloc(int alloc=3)  Line 91 + 0x16 bytes    C++
    QtCored4.dll!QListData::append()  Line 114    C++
    QtGuid4.dll!QList<QRectF>::append(const QRectF & t={...})  Line 402 + 0xd bytes    C++
    QtGuid4.dll!QList<QRectF>::operator<<(const QRectF & t={...})  Line 280 + 0x13 bytes    C++
    QtGuid4.dll!QGraphicsScene::update(const QRectF & rect={...})  Line 2819    C++
    QtGuid4.dll!QGraphicsScene::itemUpdated(QGraphicsItem * item=0x043d47b4, const QRectF & rect={...})  Line 4170    C++
    QtGuid4.dll!QGraphicsItemPrivate::updateHelper(const QRectF & rect={...}, bool force=false)  Line 2939    C++
    QtGuid4.dll!QGraphicsItemPrivate::fullUpdateHelper()  Line 2949    C++
    QtGuid4.dll!QGraphicsItem::setPos(const QPointF & pos={...})  Line 2044    C++
    QtGuid4.dll!QGraphicsItem::setPos(double ax=150.00000000000000, double ay=0.00000000000000000)  Line 362 + 0x2d bytes    C++
    netlistviewerd.dll!BlockItem::setPosition(float x=150.00000, float y=0.00000000)  Line 106    C++
    netlistviewerd.dll!NetlistPainter::paintLayerByLayer(int & x=150, QMap<int,LayerRectangle> & pageLayerRects={...}, QMap<int,QList<netlist_viewer::dnodeBlock> > & finalPage={...}, int & maxHeight=0, std::map<int,std::list<netlist_viewer::NlvPointF,std::allocator<netlist_viewer::NlvPointF> >,std::less<int>,std::allocator<std::pair<int const ,std::list<netlist_viewer::NlvPointF,std::allocator<netlist_viewer::NlvPointF> > > > > & firstLayerInNets=[0](), std::map<int,std::list<netlist_viewer::NlvPointF,std::allocator<netlist_viewer::NlvPointF> >,std::less<int>,std::allocator<std::pair<int const ,std::list<netlist_viewer::NlvPointF,std::allocator<netlist_viewer::NlvPointF> > > > > & lastLayerOutNets=[0](), int inoutLayerOption=3)  Line 1850    C++
    netlistviewerd.dll!NetlistPainter::paintPage(int pageNum=1)  Line 2273    C++
    netlistviewerd.dll!NetlistPainter::paintMultiPage(netlist_viewer::ViewType viewType=RTLVIEW)  Line 1790    C++
    netlistviewerd.dll!NetlistPainter::paintNetlist(netlist_viewer::ViewType viewType=RTLVIEW, netlist_viewer::PageType pageType=MULTIPAGE)  Line 58    C++
    netlistviewerd.dll!PaintNetlistThread::run()  Line 66    C++
    QtCored4.dll!QThreadPrivate::start(void * arg=0x04362cd8)  Line 235    C++
    msvcr80d.dll!_callthreadstartex()  Line 348 + 0xf bytes    C
    msvcr80d.dll!_threadstartex(void * ptd=0x042bb840)  Line 331    C
    kernel32.dll!7c80b683()    
    ntdll.dll!7c9106eb()    

离线vrcats
只看该作者 4楼 发表于: 2008-11-05
QGraphicsScene和item之间有复杂的signal/slot连接,最好不用多线程。由于item不是QObject的子类,也没法移到GraphicsScene的线程里去。
离线htyoung

只看该作者 3楼 发表于: 2008-11-03
由于是多线程,用断点很难发现问题
可以用看trace的方法,
给个简单的方法,在你怀疑的函数里 加上输出信息,
如 用qDebug("Fun_1");

然后通过调用函数的关系来判断是哪里有冲突.
希望有用.
***
QT5
***
离线mendynew
只看该作者 2楼 发表于: 2008-11-03
代码太多,没法贴出来啊。
能否帮忙分析下可能存在的原因和有效的调试方法?
多谢!
离线htyoung

只看该作者 1楼 发表于: 2008-10-31
光有堆栈,没代码,很难分析的。
***
QT5
***
快速回复
限100 字节
 
上一个 下一个