簡體   English   中英

Qt->從Gui-> Thread-> Qtimer設置值

[英]Qt -> Set Value from Gui->Thread->Qtimer

我有一個特殊的相機課,應該盡可能多地打電話給他以獲取下一張照片。 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才能為攝像機獲取一個值,但是我有20個值。 有什么更好的方法嗎?

您可以將20個值放入按值復制對象中。 這樣,您可以通過單個信號/插槽級聯快速通過它們。 不要忘記注冊您的自定義類型以用於排隊連接。

您可能要完全避免信號/插槽開銷。 您可以使用QSemaphore(在文檔中搜索“ Semaphores Example”)來編寫標准的生產者/消費者構造。

您還可以向線程發送一個自定義事件(包含您的數據),該事件應該比使用信號/插槽快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM