2012-03-10 34 views
3

Qthreadを使用してサブクラス化(Qthreadからクラスを派生させる)してから、必要なタスクを実行するために実行関数を書くことは正しい方法ではありません。しかし、サブクラス化の方法を使うためにいくつかの書籍やQtのドキュメントを読みましたか?Qtでスレッディング

サブクラス化の方法を使用しない理由を教えてください。 Qthreadのサブクラス化は、スレッドを使用する簡単な方法です(私は初心者ですから)。

ありがとうございました。

+1

[Qtプログラミングと長い時間がかかる計算]の重複が可能です。(http://stackoverflow.com/questions/8300983/qt-programming-and-computations-which-take-long-time) –

+0

@Nawaz、this私の質問の1つに最近の答えから来るかもしれません:http://stackoverflow.com/questions/9638226/signal-prior-qthread-event-loop-start-is-lost –

答えて

1

QThreadは、スレッドで実行するコードを配置する場所ではなく、オペレーティングシステムスレッドのインターフェイスまたはコントロールポイントとして使用するように設計されています。基本クラスの機能を拡張または特殊化するため、オブジェクト指向プログラマのサブクラスを使用します。私がQThreadをサブクラス化するために考えることができる唯一の有効な理由は、QThreadにはない機能を追加することです。スレッドのスタックとして使用するためのメモリへのポインタを提供したり、おそらくはリアルタイムインタフェース/サポートを追加することができます。ファイルをダウンロードしたり、データベースに問い合わせたり、他の種類の処理を行うためのコードをQThreadのサブクラスに追加しないでください。それ自身のオブジェクトにカプセル化する必要があります。詳細は

これをチェックしてください。..

http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/

+0

@ shobi スレッドの作成は何を意味していますか?この声明は何を意味していますか?決して気にしない:) "QThreadのすべての関数は、QThreadが起動するスレッドではなく、作成スレッドから呼び出されるように記述されています。" –

+0

@UmerFarooqもしスレッドを作成したいのであれば、 QThreadクラスのオブジェクトでは、QThreadクラスをサブクラス化するクラスは必要ありません。 – shofee

+0

@UmerFarooqあなたはUの答えを持っているか、もっと説明が必要です...質問してもらえますか。 – shofee

1

QThread documentationは、明示的にサブクラス化を行うには正しいことであると述べている:

は、サブクラスQThreadを独自のスレッドを作成し、再実装しますrun()

それは醜い設計であり、別の解決策がある(尚美がanother answerで指摘されるように)ので、これは、しかしいくらか不可解です。

+0

shobiさんの回答は無視されていますが、APIは現在他の解決法には完全には適していません。ブーストスレッドのような素敵なAPIと違って、スレッドで動作する機能を簡単に提供することはできません。シグナル/スロットのアプローチははるかに複雑で、イベントループが必要であると仮定しています。 –

2

QThreadについては、この偉大な記事を参照してください。今、The great QThread Mess by Christoph Eckert、QThreadのこの方法を使用するために私を導く:Threading without the headache by Bradley T. Hughes

ボトムライン:私見を、QThreadを使用する最も簡単な方法は、QObjectのサブクラスを作成することです、使用信号/オブジェクトを異なるイベントループを持つ別のスレッドに置くには、moveToThreadを使用します。
残念ながら、"while(true)"の種類のスレッドが絶対に必要な場合は、この機能は動作しませんが、Qtでは回避できないことがよくあります。

+0

あなたはこれが何を意味するか心配してください!初心者には分かりにくいです。 "QThread内のすべての関数が記述され、QThreadが起動するスレッドではなく、CREATING THREADから呼び出されることを意図しています。 –

+0

作成スレッドは、QThreadオブジェクトを「所有している」スレッドです。 QThread自体はスレッドではなく、別のイベントループが存在するスレッドを管理します。これは、「QThreadが起動するスレッド」 – Koying