1

EDIT2

これは、オブジェクトに排他的に QThread を与えるという次の問題に対して機能するソリューションです。

問題に対するアプローチを変更しました。MyClass で QThread を閉じたくありません。次の解決策の方が簡単で、見栄えも悪くないようです。

私の解決策は、ここに示されている解決策を変更することです: http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/

そのソリューションの問題は、QObject ワーカーが実際には削除されていない (確認した) ことでした。

QThread *myThread = new QThread();
SCIntermediary* myObj = new MyClass();
myObj->moveToThread(myThread);
connect(myThread, SIGNAL(started()), myObj, SLOT(setup()));
connect(myObj, SIGNAL(destroyed()), myThread, SLOT(quit()), Qt::DirectConnection);
connect(myObj, SIGNAL(finished()), myObj, SLOT(deleteLater()));
connect(myThread, SIGNAL(finished()), myThread, SLOT(deleteLater()));
myThread -> start();

// do your work bla bla bla

myObj -> finishIt(); // this function only emits finish() signal of myObj
myThread -> wait();

これは、エラーやその他の問題をまったく発生させずに myObj と myThread の両方を破棄するために機能した最初のソリューションです。

編集終了

クライアントとサーバーの間で何らかの処理を行うクラスを作成しようとしています。専用スレを立ててほしい。だから私がしたことは:

class Myclass : public QObject {
    Q_OBJECT
public:
    Myclass();
    ~Myclass();

private:
    QThread *my_thread;
    QTcpSocket *sock;
}

コンストラクターのコーディング方法は次のとおりです。

Myclass::Myclass(){
    my_thread = new QThread();
    my_thread -> start();
    moveToThread(my_thread);

    sock = new QTcpSocket(this);
    sock -> connectToHost("host", port);
}

これはうまくいきませんでした。TcpSocket のコードが現在の親オブジェクトと同じスレッドで実行されなかったため、機能しませんでした。そこで、セットアップ用のスロットとシグナルを作成し、コンストラクターで発行することにしました。これが私のコードが今どのように見えるかです。

class Myclass : public QObject {
    Q_OBJECT
public:
    Myclass();
    ~Myclass();

public slots:
    void setup();

signals:
    void do_setup();

private:
    QThread *my_thread;
    QTcpSocket *sock;
}

そして、その実装の一部

Myclass::Myclass(){
    my_thread = new QThread();
    my_thread -> start();
    moveToThread(my_thread);

    connect(this, SIGNAL(do_setup()), this, SLOT(setup()));
    emit do_setup();
}

void Myclass::setup(){
    sock = new QTcpSocket();
    sock -> connectToHost("host", port);
}

今では動作しますが、ここで悲しい部分が来ます - それはひどいように見えます! それはひどいもので、どうすれば見栄えがよくなるか、そもそもそのようなパターンをどのように行うべきかわかりません. 同じ効果を得るにはどうすればよいでしょうか?

さらに-これに適したデストラクタを作成する方法がわかりません-QThreadをスムーズに削除し、すべてのクラスオブジェクトを削除する方法..

編集

今のところ、解決策はまったく問題ないと思います。残っている唯一の問題は、そのためのデストラクタを作成する方法です。ここでそれを行う方法がわかりません。

4

3 に答える 3

1

シグナルを使用する代わりに、http: //qt-project.org/doc/qt-4.8/qmetaobject.html#invokeMethodを使用できます。QMetaObject::invokeMethod

QMetaObject::invokeMethod(this, "setup", Qt::QueuedConnection);

しかし、これはまだ重いですが、これがより良いオプションだと思います...誰かがより良いアイデアを持っている場合は、コメントしてください:-)

于 2012-12-30T19:16:05.950 に答える
1

デストラクタについては、Maya Posch の例を確認して ください: http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/ MyClass、おそらく、デストラクタの最後のものとしてスレッドでfinish()を呼び出し、MyClassのdestroyed()シグナルをスレッドのdeleteLaterに接続できますか?

于 2013-01-06T03:17:33.933 に答える
-1

両方のオブジェクトが新しく作成された同じスレッドにあるはずなので、接続する直前に新しく作成されたスレッドにソケットを手動で移動するとうまくいくと思いますか?

Myclass::Myclass()
{
    my_thread = new QThread();
    my_thread -> start();
    moveToThread(my_thread);

    sock = new QTcpSocket(this);
    sock -> moveToThread(my_thread);
    sock -> connectToHost("host", port);
}
于 2012-12-31T16:49:56.153 に答える