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

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

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

Спасибо.


person Evans Belloeil    schedule 30.06.2014    source источник
comment
Я очень боюсь, что вы ходите по кругу, наслаивая все более сложные и запутанные решения одной проблемы. Для начала сетевое приложение в Qt должно быть спроектировано так, чтобы хорошо работало с без использования потоков. Перемещение QObject в поток — это последний шаг после того, как все остальное работает, и это делается для уменьшения задержки. Поточно-безопасные методы не обязательно должны быть статическими. Они просто должны быть потокобезопасными или слотами, и тогда вы сможете безопасно вызывать слоты из QObject, который находится в потоке (через invokeMethod или через соединение сигнал-слот).   -  person Kuba hasn't forgotten Monica    schedule 30.06.2014
comment
Возможно, вам следует опубликовать вопрос с просьбой найти каноническое решение вашей основной проблемы. Такой вопрос может привлечь полный, канонический ответ типа «вот как следует начинать». Чтобы вопрос был по теме, вы должны описать, что вы пробовали, и проблемы, с которыми вы столкнулись.   -  person Kuba hasn't forgotten Monica    schedule 30.06.2014
comment
Эй, @KubaOber Ну, я начинаю с вашего метода, но после 3 дней исследований я не могу найти проблему, поэтому я должен продолжить и изменить, поэтому я должен использовать winsocks ... Я согласен с вами, это может становятся более сложными, но у меня есть результат, чтобы показать, как вы знаете, я стажер, и я не имею большого внимания со стороны моей иерархии, поэтому, если я не буду двигаться дальше, меня уволят. В любом случае, у меня есть правильный результат, который работает сейчас, может быть, не самый лучший, но он работает.   -  person Evans Belloeil    schedule 30.06.2014
comment
Я хочу поблагодарить вас за вашу помощь, статика немного странная, но она не скомпилируется, если метод не статичен, не знаю почему :/, может быть, это потому, что я где-то его вызываю, но он в том же класс, так что проблем обычно нет. Я отправляю канонический вопрос: stackoverflow.com/ вопросов/24446043/ Но теперь у меня есть удовлетворительный результат, но вы можете предложить что-то лучше ^^   -  person Evans Belloeil    schedule 30.06.2014


Ответы (2)


Вы можете сохранить статический указатель на экземпляр MainWindow в классе MainWindow и инициализировать его в конструкторе. Затем вы можете использовать этот указатель для вызова испускания из статической функции.

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 );
}
person TheDarkKnight    schedule 30.06.2014

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

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

person Paolo Brandoli    schedule 30.06.2014