使用了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()