我有一些問題,與此: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)
這怎麼可能?它完成了,但該方法另有說明。
工作。但是我的程序似乎沒有得到,他們都是我每次運行它出於某種原因都完成。 – chikuba 2012-03-01 00:16:53
在你的編輯中,那個函數是什麼(在什麼對象中)以及它從哪裏調用?如果你願意,我們可以把這個聊天。 – tmpearce 2012-03-01 00:39:58
函數是「checkIfFinished」。對沒錯 – chikuba 2012-03-01 00:46:34