qt qtcpserver работает только тогда, когда он создан в основной функции

Я только что написал простой qtcpserver, который примерно такой: не стреляет?

Сервер в основном работает, но только когда он создается в рамках основной функции.

работающий:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    TestServer server;

    return a.exec();
}

не работает (этот код в любом случае не будет работать, просто чтобы показать вам, что я имею в виду):

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    classA cA;

    return a.exec();
}

classA::classA(QObject *parent) :
    QThread(parent)
{
    TestServer server;
}

Когда я создаю класс A внутри основной функции и внутри A я создаю tcpserver, функция incomingConnection() никогда не выполняется, хотя сам сервер запускается. Я вижу это, потому что получаю сообщение "Запуск сервера в порту..." от конструктора A:

TestServer::TestServer(QObject *parent):
    QTcpServer(parent)
{
    if (this->listen(QHostAddress::Any, 2323)) {
        qDebug() << "Server start at port: " << this->serverPort();
    } else {
        qDebug() << "Start failure";
    }
}

Это означает, что моя основная функция теперь содержит класс A и функцию qtcpserver. Функция qtcpserver снова создает новый поток при подключении клиента. Что я хочу сделать, так это иметь сообщения, полученные потоком, в моем классе A. Вот почему я хочу создать qtcpserver в классе A.

У кого-нибудь есть предложение по этому поводу? Как я могу создать сервер внутри A?

Спасибо!


person cwly    schedule 24.01.2016    source источник
comment
Вы создаете объект server как локальную переменную внутри конструктора classA, что означает, что ваш объект будет уничтожен, как только управление выйдет из этой функции. (Кроме того, из любви к котятам, вам не нужен QThread для управления TCP-сервером)   -  person peppe    schedule 24.01.2016
comment
да, это помогло. Почему я не придумал это сам? довольно просто... :)   -  person cwly    schedule 24.01.2016


Ответы (1)


Вам нужно сделать объект сервер членом класса classA, потому что теперь этот объект уничтожается сразу после создания (потому что теперь вы создаете его в локальной области видимости)

person Vladimir Bershov    schedule 24.01.2016