在静态函数中发射一个信号。

4
我有一个静态函数: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
        }
    }
}

有没有一种方法可以发射我的信号?

谢谢。


我非常担心你正在循环运行,为一个单一的问题逐渐添加更复杂和错综复杂的解决方案。首先,在Qt中设计网络应用程序应该能够在没有线程使用的情况下正常工作。将QObject移动到线程中是最后一步,前提是其他事情已经正常工作,并且是为了减少延迟。线程安全的方法不需要是静态的。它们只需要是线程安全的或者是槽函数,然后您可以通过invokeMethod或信号槽连接安全地从驻留在线程中的QObject调用这些槽函数。 - Kuba hasn't forgotten Monica
也许你应该发布一个问题,寻求一个基本问题的规范解决方案。这样的问题可能会吸引到完整、规范、这就是应该开始的答案类型。为了使问题符合主题,你应该描述你尝试过什么以及你所面临的问题。 - Kuba hasn't forgotten Monica
嘿@KubaOber,我一开始使用了你的方法,但经过3天的研究,我找不到问题,所以我必须继续改变,所以我必须使用winsocks...我同意你的看法,它可能会变得更加复杂,但我有结果可以展示,就像你知道的,我是一名实习生,我没有得到很多来自我的上级的考虑,所以如果我不继续前进,我就会被解雇。无论如何,我现在有一个适当的结果,也许不是最好的,但它能够工作。 - Evans Belloeil
我想感谢你的帮忙,静态变量有些奇怪,但如果方法不是静态的话就无法编译,不知道为什么 :/ ,可能是因为我在某个地方调用了它,但它在同一个类中,所以通常没有问题。我在stackoverflow上发布了一个规范问题:http://stackoverflow.com/questions/24446043/communication-between-server-thread-and-ihm 但现在我已经有了满意的结果,不过你可以提出更好的建议^^ - Evans Belloeil
2个回答

4
您可以在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 );
}

3
将指向类的指针作为参数传递给lancerServeur,或者您可以在工作类上使用一个槽,并将其移动到线程中。

参见此示例http://qt-project.org/doc/qt-4.8/qthread.html,了解如何使用槽在单独的线程上执行工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接