我有一些问题:
首先我创建我的对象并将其移动到一个线程:
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编程 - Mark 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);
我在最后一次电话会议上的外印是:
一个线程完成QThread(0x43ee180)
未完成QThread(0x43ee180)
这怎么可能?它完成了,但方法说不然。
答案 0 :(得分:7)
你想要QObject::thread()
,而不是QThread::currentThreadId()
- 第二个返回调用函数的线程。
一旦你解决了这个问题,你的指针就可以了。