Qt и многопоточный локальный сервер, почему весь пользовательский интерфейс застрял? - PullRequest
0 голосов
/ 06 января 2012

Вот минимальный тестовый пример, я попытался запустить сервер локального домена с QThread, поэтому пользовательский интерфейс не должен зависать.Но когда он запустился, я увидел Listening вывод из qDebug (), но виджеты, добавленные из редактора форм, полностью исчезли, все пошло медленно (например, изменение размера окна), если я удаляю thread.start(), пользовательский интерфейс отображается и работает хорошо.

#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
}

Ответы [ 2 ]

1 голос
/ 06 января 2012

Системный вызов accept (2) по умолчанию блокируется.Вы должны воспользоваться мультиплексированием системного вызова poll (2) или select (2) , используемого в цикле событий exec QApplication.

См. этот вопрос и используйте модуль QtNetwork .

0 голосов
/ 08 января 2012

Прежде всего, ваш setupServer всегда вызывается в графическом потоке.Предоставьте свой собственный класс на основе QThread и метод запуска reimplement.Поместите ваш код "setupServer" внутрь

...