2014-06-30 31 views
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 
     } 
    } 
} 

有沒有辦法發出我的信號?

謝謝。

+0

我非常害怕你在圈子裏運行,爲單一問題分層逐步更復雜和複雜的解決方案。首先,Qt中的聯網應用程序應該被設計成可以*很好地*使用* no *線程。將'QObject'移動到線程是本來工作之後的最後一步,並且是爲了減少延遲而完成的。線程安全的方法不需要是靜態的。它們只需要線程安全或插槽,然後就可以安全地從駐留在線程中的'QObject'調用槽(通過'invokeMethod'或通過信號槽連接)。 –

+0

也許你應該提出一個問題,要求一個規範的解決方案,無論你的基本問題是什麼。這樣的問題可能會吸引一個完整的,規範的,即應該開始的答案類型。爲了使問題成爲話題,您應該描述您嘗試過的方式以及您遇到的問題。 –

+0

嘿@KubaOber嗯,我開始使用你的方法,但經過3天的研究,我找不到問題,所以我必須繼續改變,所以我必須使用winsocks ...我同意你的觀點可能會變得更加複雜,但我有結果表明,就像你知道我是一名實習生一樣,而且我的層次結構中沒有很多考慮因素,所以如果我不繼續,我會被解僱。無論如何,我有一個適當的結果,現在可行,也許不是最好的,但它的工作。 –

回答

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); 
} 
3

將指針傳遞給類作爲lancerServeur的參數,或者可以在worker類上使用插槽並將其移至線程。

看到這個例子http://qt-project.org/doc/qt-4.8/qthread.html關於如何使用一個插槽做一個單獨的線程工作。