2016-12-31 3 views
1

Qt GUIアプリケーションは、何らかの重要なリアルタイム作業をしていますが、何らかの理由で中断してはいけません。現時点では、GUIとのやりとりがなくても、ボタンをクリックするかフォームをドラッグするとアプリケーションが完璧に実行されていますが、クリックが処理されている間は転送が停止しているようです。フォワーディングはQTimerループで実行されますが、これはGUIスレッドとは別のスレッドに入れていますが、結果に変更はありません。 は、ここでは、コードの一部です:私が先に言ったように、このコードは、任意のデータを損失することなく、アイドルの状況下で細かい実行されているQt GUIアプリケーションはGUIとのやりとり時にリアルタイムプロセスを停止します

class MainWindow : public QMainWindow 
{ 
    QSerialPort serialReceiver; // This is the serial object 
    QTcpSocket *clientConnection; 
} 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    // Some Initializations ... 

    QThread* timerthread = new QThread(this); // This is the thread that is supposed to do the forwarding 
    QTimer *timer = new QTimer(0); 
    timer->setInterval(25); 
    timer->moveToThread(timerthread); 

    connect(timer ,SIGNAL(timeout()),this,SLOT(readserialData())); // Run readserialData() each 25ms 
    timer->connect(timerthread, SIGNAL(started()), SLOT(start())); 
    timerthread->start(); 
} 


void MainWindow::readserialData() 
{ 
    if(serialReceiver.isOpen()) 
    { 
     qint64 available = serialReceiver.bytesAvailable(); 
     if(available > 0) // Read the serial if any data is available 
     {  
      QByteArray serialReceivedData = serialReceiver.readAll(); // This line would not be executed when there is an interaction with the GUI 
      if(isClientConnet) 
      { 
       int writedataNum = clientConnection->write(serialReceivedData); 
      } 
     } 
    } 
} 

。私は何か間違っているのですか?

+0

多分http://stackoverflow.com/questions/19252608/using-qthread-and-movetothread-properly-with-qtimer-and-qtcpsocketがお手伝いします – transistor

答えて

1

他のスレッドで重要なリアルタイム作業を実行することをお勧めします。 GUIスレッドまたはメインは描画を行い、もう一方は処理を行う必要があります。 GUIスレッドに関する

Qtのドキュメントは言う:

GUIスレッドとワーカースレッド 述べたように、それが開始されたとき、それぞれのプログラムは、一つのスレッドを持っています。このスレッドは、「メインスレッド」(Qtアプリケーションでは「GUIスレッド」とも呼ばれます)と呼ばれます。 Qt GUIはこのスレッドで実行する必要があります。すべてのウィジェットといくつかの関連するクラス(QPixmapなど)は、セカンダリスレッドでは機能しません。セカンダリスレッドは、メインスレッドから処理作業をオフロードするために使用されるため、通常、「ワーカースレッド」と呼ばれます。

もスレッドに を使用して

をマルチスレッド使用するスレッドのための2つの使用例は基本的にあります。 マルチコア・プロセッサを利用することにより、より高速な処理を行います。 GUIスレッドまたは他のタイムクリティカルスレッドは、長時間にわたる処理をオフロードしたり、他のスレッドへの呼び出しをブロックしたりすることによって応答します。

あなたのケースでは、別のスレッドでリアルタイム処理を実行するとUI遅れの問題が修正され、リアルタイム性の問題も修正されます。

Qtのドキュメントからスレッドの基本を読むことをお勧めします。

Threading basics

関連する問題