2012-03-01 2616 views
0

我有一些問題,與此:Qt在主線程中獲得線程ID?

首先創建我的對象,並將其移動到一個線程:

FileUploader *fileUploader = new FileUploader(fileList_, start, (offset == 0 ? (fileList_.count() - start) : offset)); 
QThread *fileUploaderThread = new QThread; 
fileUploader->moveToThread(fileUploaderThread); 

fileUploaderThreads_.append(fileUploaderThread); 
fileUploaders_.append(fileUploader); // contains pointers to the objects 

connect(fileUploader, SIGNAL(progressChangedAt(int)), model_, SLOT(reportProgressChanged(int)), Qt::QueuedConnection); 
connect(fileUploader, SIGNAL(statusChangedAt(int)), model_, SLOT(reportStatusChanged(int)), Qt::QueuedConnection); 
connect(fileUploader, SIGNAL(finished()), fileUploaderThread, SLOT(quit()), Qt::QueuedConnection); 
connect(fileUploaderThread, SIGNAL(finished()), this, SLOT(checkIfFinished()), Qt::QueuedConnection); 

中插槽checkIfFinished()我想去儘管所有的線程,看看他們是否放棄。 qDebug()< <「一個線程完成」;

foreach(QThread *thread, fileUploaderThreads_) { // or FileUploader* fileuploader, fileUploaders_ ? 
    if(thread && !thread->isFinished()) { 

     qDebug() << "not finished " << thread->currentThreadId(); 

     return; // not done 
    } 
} 

當這個被打印出來,我只得到主線程ID,而不是線程。我試圖打印線程ID出來,但沒有運氣(他們開始後)。 我之所以這麼做,是因爲編寫「高級Qt編程 - 馬克S」的人對QThreads做了類似的事情,他把它放在一個列表中,並檢查它們是否在哪裏完成。現在唯一可行的就是在fileUploader完成時殺死線程的連接。

另外,我如何存儲線程指針?如果他們似乎沒有指出正確的話題,我將如何刪除它們。

編輯:

我試圖QObject對象存儲在一個列表,而不是做這個:

QThread *senderx = qobject_cast<QThread*>(sender()); 

qDebug() << "one thread done" << senderx; 

foreach(FileUploader *fileUploader, fileUploaders_) { 
    if(fileUploader && !fileUploader->thread()->isFinished()) { 

     qDebug() << "not finished " << fileUploader->thread(); 

     return; // not done 
    } 
} 
//done 
qDebug() << "done"; 
setButtonState(false); 

而且我在最後一次通話outprint是:

一個線程中完成的QThread (0x43ee180)

未完成QThread(0x43ee180)

這怎麼可能?它完成了,但該方法另有說明。

回答

6

你想QObject::thread(),不QThread::currentThreadId() - 第二個返回線程調用函數在

一旦你解決這個問題,你的指針將正常工作。

+0

工作。但是我的程序似乎沒有得到,他們都是我每次運行它出於某種原因都完成。 – chikuba 2012-03-01 00:16:53

+0

在你的編輯中,那個函數是什麼(在什麼對象中)以及它從哪裏調用?如果你願意,我們可以把這個聊天。 – tmpearce 2012-03-01 00:39:58

+0

函數是「checkIfFinished」。對沒錯 – chikuba 2012-03-01 00:46:34