2012-01-06 3 views
0

これは最小限のテストケースですが、QThreadというローカルドメインサーバーを起動しようとしたため、UIが邪魔になることはありません。しかし、起動時にqDebug()から出力されたListeningが表示されていましたが、フォームエディタから追加されたウィジェットは完全に消えてしまい、すべてが遅くなりました(ウィンドウのサイズ変更など)。Qtとスレッドローカルサーバー、なぜUI全体が固まったのですか?

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    connect (&thread , SIGNAL(started()) , SLOT(setupServer())); 
    thread.start(); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::setupServer() 
{ 
    struct sockaddr_un address; 
    int socket_fd, connection_fd; 
    socklen_t address_length; 

    // create socket .. and create socket file .. 
    // bind ... 
    // listen .. 

    qDebug() << "Listening .."; 

    while((connection_fd = ::accept(socket_fd, 
            (struct sockaddr *) &address, 
            &address_length)) > -1) 
    { 
     qDebug() << "Got an connection."; 
     ::close (connection_fd); 
    } 

    // close socket and remove the socket file 
} 

答えて

1

accept(2) syscallはデフォルトでブロックします。 QApplicationのexecイベントループで使用される多重化システムコールpoll(2)またはselect(2)を利用する必要があります。

this questionを参照し、QtNetworkモジュールを使用してください。

0

まず、setupServerは常にGUIスレッドで呼び出されます。独自のQThreadベースのクラスを提供し、実行メソッドを再実装します。 "setupServer"コードを内部に入れてください

関連する問題