У меня есть статическая функция: 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 );
}
Передайте указатель на класс в качестве параметра lancerServeur, или вы можете использовать слот в рабочем классе и переместить его в поток.
Смотрите этот пример http://qt-project.org/doc/qt-4.8/qthread.html о том, как использовать слот для выполнения работы в отдельном потоке.