在静态函数中发出一个信号

Emit a signal in a static function

本文关键字:一个 信号 静态函数      更新时间:2023-10-16

我有一个静态函数:static void lancerServeur(std::atomic<bool>& boolServer),这个函数是静态的,因为我在一个线程中启动它,但由于这个,我不能在这个函数中发出信号。下面是我要做的:

void MainWindow::lancerServeur(std::atomic<bool>& boolServer){
    serveur s;
    StructureSupervision::T_StructureSupervision* bufferStructureRecu;
    while(boolServer){
        bufferStructureRecu = s.receiveDataUDP();
        if(bufferStructureRecu->SystemData._statutGroundFlight != 0){
            emit this->signal_TrameRecu(bufferStructureRecu);//IMPOSSIBLE TO DO
        }
    }
}

有办法发出我的信号吗?

谢谢。

您可以在MainWindow类中保留一个指向MainWindow实例的静态指针,并在构造函数中初始化它。然后,您可以使用该指针从静态函数调用emit。

class MainWindow : public QMainWindow
{
    ...
    private:
        static MainWindow* m_psMainWindow;
        void emit_signal_TrameRecu(StructureSupervision::T_StructureSupervision* ptr)
        {
            emit signal_TrameRecup(ptr);
        }
};
// Implementation
// init static ptr
MainWindow* MainWindow::m_psMainWindow = nullptr; // C++ 11 nullptr
MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
{
    m_psMainWindow = this;
}

void MainWindow::lancerServeur(std::atomic<bool>& boolServer)
{
    StructureSupervision::T_StructureSupervision* bufferStructureRecu;
    ...
    if(m_psMainWindow)
        m_psMainWindow->emit_signal_TrameRecu( bufferStructureRecu );
}

将指向该类的指针作为参数传递给lancerserver,或者您可以使用worker类上的插槽并将其移动到线程中。

请参阅下面的示例http://qt-project.org/doc/qt-4.8/qthread.html,了解如何使用插槽在单独的线程上完成工作。