私はこれにいくつかの問題があります:私はすべてのスレッドかかわらず行くと、彼らかどうかを確認したいスロットcheckIfFinishedでメインスレッドでスレッド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);
ザ・():
まず、私は私のオブジェクトを作成し、スレッドに移動します終了する。 qDebug()< < "一つのスレッド済"。
foreach(QThread *thread, fileUploaderThreads_) { // or FileUploader* fileuploader, fileUploaders_ ?
if(thread && !thread->isFinished()) {
qDebug() << "not finished " << thread->currentThreadId();
return; // not done
}
}
これを印刷すると、スレッドではなくメインスレッドIDだけが表示されます。私はスレッドIDを出力しようとしましたが、運が悪いです(彼らがofcを開始した後)。 人が書いているので、私はこの私をやっている理由は、「高度なQtのプログラミングを - マーク・S」は、彼らが完成ところならば、彼はリストに入れて、確認QThreadsで同様のことをしました。今作業しているのは、fileUploaderが完了したときにスレッドを殺す接続だけです。
はまた、どのように私は、スレッドのためのポインタを格納しますか?私は彼らが正しいスレッドを指していないように見える場合は、それらをすべて削除する方法をwounder。
編集:
私が代わりにリストでの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
あなたの編集では、どのような機能が(どのオブジェクトで)どこから呼び出されていますか?あなたが望むなら、これをチャットに持ち込むことができます。 – tmpearce
関数は "checkIfFinished"です。ええ確認 – chikuba