2012-03-01 25 views
0

私はこれにいくつかの問題があります:私はすべてのスレッドかかわらず行くと、彼らかどうかを確認したいスロット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)

どのようにこれは可能ですか?それは行われますが、方法はそうではないと言います。

答えて

6

あなたがQObject::thread()をしたい、しませQThread::currentThreadId() - 。二つ目は、関数がで呼び出されたスレッドを返し

あなたのポインタが正常に動作します、という修正したら。働い

+0

。しかし、私のプログラムは何らかの理由でそれを実行するたびにすべて完了しているとは思われません。 – chikuba

+0

あなたの編集では、どのような機能が(どのオブジェクトで)どこから呼び出されていますか?あなたが望むなら、これをチャットに持ち込むことができます。 – tmpearce

+0

関数は "checkIfFinished"です。ええ確認 – chikuba

関連する問題