Qt在主线程中获取线程ID?

时间:2012-03-01 00:03:32

标签: c++ multithreading qt

我有一些问题:

首先我创建我的对象并将其移动到一个线程:

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)

这怎么可能?它完成了,但方法说不然。

1 个答案:

答案 0 :(得分:7)

你想要QObject::thread(),而不是QThread::currentThreadId() - 第二个返回调用函数的线程。

一旦你解决了这个问题,你的指针就可以了。