C++ 在静态函数中发出信号

C++ 在静态函数中发出信号,c++,qt,signals,emit,C++,Qt,Signals,Emit,我有一个静态函数:static void lancerServeur(std::atomic&boolServer),这个函数是强制静态的,因为我在线程中启动它,但是由于这个原因,我不能在这个函数中发出信号。以下是我尝试做的: void MainWindow::lancerServeur(std::atomic<bool>& boolServer){ serveur s; StructureSupervision::T_StructureSupervision

我有一个静态函数:
static void lancerServeur(std::atomic&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
        }
    }
}
void主窗口::LanserServeur(标准::原子和布尔服务器){
serveur s;
结构监督::T_结构监督*缓冲结构重现;
while(boolServer){
bufferStructureRecu=s.receiveDataUDP();
如果(bufferStructureRecu->SystemData.\u statutGroundFlight!=0){
发出此->信号\u TrameRecu(bufferStructureRecu);//不可能
}
}
}
有没有办法发出我的信号


谢谢。

您可以在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 );
}
class主窗口:公共QMainWindow
{
...
私人:
静态主窗口*m_psMainWindow;
无效发射信号传输(结构监控::T结构监控*ptr)
{
发射信号灯(ptr);
}
};
//实施
//初始化静态ptr
MainWindow*MainWindow::m_psMainWindow=nullptr;//C++ 11 null pTrR
主窗口::主窗口(QWidget*父窗口)
:QMainWindow(父级)
{
m_psMainWindow=此;
}
void主窗口::lancerServeur(标准::原子和布尔服务器)
{
结构监督::T_结构监督*缓冲结构重现;
...
如果(m_psMain窗口)
m_psMain窗口->发射信号\u TrameRecu(缓冲结构重现);
}

将指向类的指针作为参数传递给lancerServeur,或者您可以使用辅助类上的插槽并将其移动到线程


请参阅此示例,了解如何使用插槽在单独的线程上执行工作。

我非常担心,您正在循环运行,为单个问题逐步分层更复杂和复杂的解决方案。首先,Qt中的网络应用程序应该设计为在不使用线程的情况下工作良好。将
QObject
移动到线程是其他工作完成后的最后一步,这样做是为了减少延迟。线程安全方法不需要是静态的。它们只需要是线程安全的或插槽,然后您就可以从驻留在线程中的
QObject
安全地调用插槽(通过
invokeMethod
或通过信号插槽连接)。也许您应该发布一个问题,询问您的基本问题的规范解决方案。这样一个问题可能会吸引一个完整的、规范的、应该如何开始的答案。要在主题上提出问题,你应该描述你尝试了什么,以及你面临的问题。嘿@KubaOber好吧,我开始使用你的方法,但经过3天的研究,我找不到问题,所以我必须继续改变,所以我必须使用winsocks。。。我同意你的观点,这可能会变得更复杂,但我有结果要展示,就像你知道我是一名实习生,我没有从我的层级中得到太多的考虑,所以如果我不继续前进,我就被解雇了。不管怎么说,我现在得到了一个合适的结果,可能不是最好的,但它很有效。我想感谢你的帮助,静态有点奇怪,但如果方法不是静态的,它就不会编译,不知道为什么:/,可能是因为我在某处调用它,但它在同一个类中,所以通常没有问题。我提出了一个尖锐的问题:但我现在有一个令人满意的结果,但你可以提出更好的建议^^