2

メインウィンドウを持ち、このウィンドウから QDialog を作成するアプリケーションを作成しました。この QDialog は、カメラから受け取った画像を送信する RenderThread を作成するか、例ではテキストを送信する必要があります。これをデバッグすると、スロットにブレークポイントを追加してCameraWindow::debugSomethingもキャッチされないため、接続が確立されないようです。どうしたの ?私はこの例に従いました: http://qt-project.org/doc/qt-4.8/threads-mandelbrot.htmlしかし、何か間違ったことをしたようです。

qtDEVC::qtDEVC(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);
    connect (ui.pushButton_startCam, SIGNAL( clicked() ),this,SLOT( startCam() ) );

    /**Threading*/
    CameraWindow camWindow = new CameraWindow(this);
}


int qtDEVC::startCam()
{
    camWindow.show();
    camWindow.startCaptureThread();
}

CameraWindow クラス:

 CameraWindow::CameraWindow(QWidget *parent)
        : QDialog(parent)
    {
    ui.setupUi(this);

    connect(&thread, SIGNAL(sendText(std::string)),
        this, SLOT(debugSomething(std::string)));
}

void CameraWindow::debugSomething(std::string something){
    QString somethings(something.c_str());
qDebug()<<somethings;
}

int CameraWindow::startCaptureThread(){

    RenderThread *thread = new RenderThread(this, guid, CLEYE_COLOR_RAW, CLEYE_VGA, 50); 

    thread->StartCapture(); //starts thread in low priority and sets _running to true
}

CameraWindow ヘッダー

 class CameraWindow : public QDialog
 {
    Q_OBJECT

    public:
    CameraWindow(QWidget *parent = 0);
    ~CameraWindow();
    Ui::CameraWindow ui;

public slots:
    int startCaptureThread();
    void debugSomething(QString);

private:
    RenderThread thread;
};

RenderThread クラス

 void RenderThread::run()
 {

    // image capturing loop
    while(_running)
    {
    qDebug()<<("render while()"); //is printed with qdebug correctly
    if (restart)
        break;
           if (abort)
               return;

    qDebug("it");  //is also printed with qdebug correctly

    emit sendText(text);
}

RenderThread ヘッダー

class RenderThread : public QThread
{
    Q_OBJECT

public:
    RenderThread(QObject *parent, GUID cameraGUID, CLEyeCameraColorMode mode, CLEyeCameraResolution resolution, float fps);
    RenderThread();
    ~RenderThread();

    bool StartCapture();

signals:

    void sendText(QString &text);

protected: 
    void run();

private:
    QMutex mutex;
    QWaitCondition condition;
    //some more private variables for construction

};

この作品はどこか間違っているように思えます:RenderThread *thread = new RenderThread(this);

4

3 に答える 3

1

その質問でまず気になるのが「RenderThread」という言葉です。Qt はメイン スレッドでのレンダリングのみを許可することに注意してください。画像データの計算用に個別のスレッドを作成できますが、ペインタを使用してオブジェクトを描画するときはいつでも、メイン スレッドで実行する必要があります。ただし、画像をキャプチャして、シグナルとスロットを介してメイン スレッドに渡すだけであれば、問題ありません。

次に、すべてのコードを示していませんが、RenderThread::run() という関数と Qt の例から、ここで QThread から継承した可能性があると想定しています。その場合は、QThread の使用方法ではないことに注意してください。代わりに、クラスを QObject から継承し、それを QThread に移動する必要があります。QThread の適切な使用方法については、こちらを参照してください。

あなたが従ったのは Qt の例であることは知っていますが、Qt の人たちでさえ、それは悪い考えだと考えています。これは、QThreads を実際に使用する方法の記事です。

それを念頭に置いて、これに QThread を使用する方法の概要を次に示します。

class CameraWindow : public QDialog
{
    private:
      CameraObject* m_pCamObject;
};

class CameraObject : public QObject
{
    Q_OBJECT
    public:

    private slots:
         startCaptureThread();

    private:
};

int CameraWindow::startCaptureThread()
{
     m_pCamObject = new CameraObject;

     QThread* pThread = new QThread;

     this->moveToThread(pThread); // CameraObject will run on the new thread

     connect(pThread, SIGNAL(started()), m_pCamObject, SLOT(startCaptureThread()));
     connect(pThread, SIGNAL(finished()), pThread, SLOT(deleteLater()); // clear up when 

終了した

     pThread->start();
}

ここに CameraObject があり、CameraWindow から分離されていることに注意してください。QThread は単なるスレッドのコントローラーであり、CameraObject から完全に分離されています。

この方法でスレッドを処理するもう 1 つの理由は、オブジェクトごとに常に新しいスレッドを作成するのではなく、複数の QObject インスタンスを新しいスレッドに移動できることです。CPU コアよりも多くのスレッドがある場合、さらに別のスレッドを作成しても得られる可能性はほとんどありません。

于 2013-09-03T14:47:45.810 に答える
-1

上記の例では、CameraWindowclass はRenderThread threadではなく変数を保持していますRenderThread *thread

connect 呼び出しでポインター アドレスを接続しています。

connect(&thread, SIGNAL(sendText(std::string)),
    this, SLOT(debugSomething(std::string)));

適切なアドレスを使用してみてください:

connect(thread, SIGNAL(sendText(std::string)),
    this, SLOT(debugSomething(std::string)));

これはテスト済みの回答ではありません。

于 2013-09-03T14:24:43.720 に答える