0

次の画像を取得するためにできるだけ頻繁に呼び出す必要がある特別なカメラ クラスがあります。GUI 自体には、カメラ パラメーターと画像出力の設定を変更するためのスライダーがいくつか含まれています。

これが私のクラスの簡単な構造です:

class CameraWorker : public QObject
{
    Q_OBJECT

public:
    CameraWorker();

signals:
    void imageReady(const QImage &);

private slots:
    void onCamera();
    void setValue(int value);

private:
    Camera camera;
};

class CameraThread : public QThread
{
    Q_OBJECT

public:
    CameraThread();

signals:
    void imageReady(const QImage &);
    void gotValue(int value);

private slots:
    void getImage(const QImage &img);
    void setValue(int value);

private:
    void run();
};

私のメインウィンドウには以下が含まれます:

connect(ui.value, SIGNAL(valueChanged(int)), cameraThread, SLOT(setValue(int)));

私のカメラ スレッドには以下が含まれます。

void CameraThread::run()
{
    CameraWorker worker;
    QTimer timer;
    connect(&timer, SIGNAL(timeout()), &worker, SLOT(onCamera()));
    connect(&worker, SIGNAL(imageReady(const QImage &)), this, SLOT(getImage(const QImage &)));
    connect(this, SIGNAL(gotValue(int)), &worker, SLOT(setValue(int)));

    timer.start(0);
    exec();
}

void CameraThread::setValue(int value)
{
    emit gotValue(value);
}

そして、私のカメラ ワーカーには以下が含まれます。

void CameraWorker::setValue(value)
{
    camera.setValue(value);
}

問題は、Signal -> Slot -> Signal -> Slot -> camera.setValue を呼び出してカメラに 1 つの値を取得する必要があることですが、値が 20 あります。これを行うより良い方法はありますか?

4

1 に答える 1

1

20 個の値を値によるコピー オブジェクトに入れることができます。そうすれば、単一のシグナル/スロットカスケードでそれらをすばやく渡すことができます。キュー接続で使用するカスタム タイプを登録することを忘れないでください。

シグナル/スロットのオーバーヘッドを完全に回避したい場合があります。QSemaphore を使用して、標準のプロデューサー/コンシューマー構造を作成できます (ドキュメントで「セマフォの例」を検索してください)。

カスタム イベント (データを含む) をスレッドに送信することもできます。これは、シグナル/スロットを使用するよりも高速です。

于 2014-07-01T21:48:09.653 に答える