Испускать сигнал в статической функции

У меня есть статическая функция: 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
}
}
}

Есть ли способ испустить мой сигнал?

Благодарю.

4

Решение

Вы можете сохранить статический указатель на экземпляр 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 );
}
4

Другие решения

Передайте указатель на класс в качестве параметра lancerServeur, или вы можете использовать слот в рабочем классе и переместить его в поток.

Смотрите этот пример http://qt-project.org/doc/qt-4.8/qthread.html о том, как использовать слот для выполнения работы в отдельном потоке.

3

По вопросам рекламы [email protected]