Russian Qt Forum

Qt => Вопросы новичков => Тема начата: f00rZik от Май 23, 2016, 12:04



Название: Вывод в консоль из потока (TcpServer) (HELP)
Отправлено: f00rZik от Май 23, 2016, 12:04
Здравствуйте, возникла такая проблема в main.cpp крутится цикл на чтение из консоли, в консоль пишем всё хорошо, из main и из класса который запускается после введения start_all.
Но дальше почему-то перестаёт писать в консоль, стоить убрать цикл на чтение и всё хорошо пишется.( TcpServer)
main:
Код:
QTextStream qtin(stdin, QIODevice::ReadOnly);
    QString line = "";
    while (line != QString("quit")){
        qtin >> line;
        if(line.contains("start_all", Qt::CaseInsensitive))
             start_all();
        if(line.contains("stop_all", Qt::CaseInsensitive))
             stop_all();
    }
start_all  
Код:
void start_all(){
    if(server1 != "")
        server1.startServer(server1.toInt());
    if(server2 != "")
        server2.startServer(server2.toInt());
}
server1
Код:
void server1::startServer(int port)
{
    QTextStream Qcout(stdout);
    if(!this->listen(QHostAddress::Any, port))
        Qcout << "Could not start server" << endl;
    else
        Qcout << "Server 1 start on port " << port << "..." << endl;
}
void server1::incomingConnection(qintptr socketDescriptor)
{
    QTextStream Qcout(stdout);
    Qcout << socketDescriptor << " Connecting..." << endl;
    server1_protocol *thread = new server1_protocol(socketDescriptor, this);
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();
}
void server1::stopServer(){
    this->close();
}

Фраза  Server 1 start on port выводится в консоль, а дальше перестаёт, подключаюсь к серверу и не выводит ничего. (если цикл стоит на чтение)

server1_protocol
Код:
void server1_protocol::run()
{
    QTextStream Qcout(stdout);
    Qcout << " Thread started" << endl;
    socket = new QTcpSocket();
    if(!socket->setSocketDescriptor(this->socketDescriptor))
    {
        emit error(socket->error());
        return;
    }
    connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()), Qt::DirectConnection);
    connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
    Qcout << socketDescriptor << " Device Connected" << endl;

    exec();
}

void server1_protocol::readyRead()
{
    QTextStream Qcout(stdout);
    QByteArray Data = socket->readAll();
    Qcout << socketDescriptor << " Data in: " << Data << endl;
    socket->write(Data);
}

void server1_protocol::disconnected()
{
    QTextStream Qcout(stdout);
    Qcout << socketDescriptor << " Disconnected" << endl;
    socket->deleteLater();
    exit(0);
}



Помогите пожалуйста, совсем не понимаю почему так происходит.


Название: Re: Вывод в консоль из потока (TcpServer) (HELP)
Отправлено: Kurles от Май 23, 2016, 12:41
Cудя по всему у тебя сервер(а) стартует в основном потоке, и так как qtin(...) блокирует поток ожиданием ввода с консоли, тупо дело до void server1::incomingConnection(qintptr socketDescriptor) не доходит. Попробуй перенести сервер(а) в отдельный поток, в принципе в том же дополнительном потоке можно и клиентов обрабатывать, не городя поток на соединение. Ну и проверяй через QThread::currentThread() что всё это действительно работает в разных потоках.


Название: Re: Вывод в консоль из потока (TcpServer) (HELP)
Отправлено: f00rZik от Май 23, 2016, 13:57
К сожалению если пихаю сервер в новый поток, то происходит SIGSEGV - Segmentation fault
И всё падает.


Название: Re: Вывод в консоль из потока (TcpServer) (HELP)
Отправлено: f00rZik от Май 23, 2016, 14:02
Хотя, нет сделал ошибку в коде уже нашёл, но в новом потоке всё равно ничего не выводит :)
Всё то-же самое.


Название: Re: Вывод в консоль из потока (TcpServer) (HELP)
Отправлено: Kurles от Май 24, 2016, 21:34
Хотя, нет сделал ошибку в коде уже нашёл, но в новом потоке всё равно ничего не выводит :)
Всё то-же самое.
Давай полностью проекты клиента и сервера в студию, очевидно что ты что то делаешь не так, вывод в консоль блокироваться не должен.