我正在將應用程序從QT3移植到QT4,並在線程更新QProgressDialog時繼續遇到問題。原代碼粗略設計,像這樣:將線程從QT3移植到QT4
class ScanProcess : QObject{
Q_OBJECT
public:
QProgressDialog* progress;
private:
ScanProcessThread* thread;
};
class ScanProcessThread : QThread {
Q_OBJECT
public:
void run();
};
這是運行qt3to4,使從QT移植指南進行適當的更改後。
在最初的設計中,ScanProcessThread內:
void ScanProcessThread::run(){
//...
ProgressInfo *prog = new ProgressInfo(); //then fill it in
QCustomEvent* progEvent = new QCustomEvent(QEvent::User+1, (void*)prog);
QCoreApplication::postEvent(parent, progEvent);//Parent is pointer to the ScanProcess
//...
}
void ScanProcess::customEvent(QCustomEvent *e){
if(e->type() == QEvent::User+1){
//update QProgressDialog
progres->setValue(prog.index);//Value from the ProgressInfo passed above
//This line crashes deep in ntdll, but I have traced it to the QProgressDialog::repaint()
}
}
struct ProgressInfo {int count; int index; QString text;};
所以,這是最重要的代碼。對QProgressDialog :: Repaint的調用似乎總是在ntdll深處崩潰。我嘗試了兩種方法: 1)使用QCoreApplication :: postEvent() 2)傳遞QProgressDialog *並讓ScanProcessThread直接更新它。在每種情況下,都是失敗的QProgressDialog :: repaint()。有任何想法嗎?
(qt4.4中,Windows XP SP3時,Visual Studio 2008 /)
只是一個說明,但我會讓我自己的自定義事件類來傳達進度信息,而不是鑄造成無效並返回。如果要發佈的對象不刪除指向的代碼,則發佈潛在的內存泄漏。此外,沒有任何東西可以釋放內存,如果該類發佈在處理事件之前消失,或者如果派生類覆蓋它並忘記這麼做,或者... – 2009-12-29 19:15:47
@cjhuitt我會做很多不同的事情,如果我有自己編寫應用程序:)也就是說,這段代碼確實在自定義事件中清除了自己的指針(我忘了添加該行)。 – 2009-12-29 19:24:35