Russian Qt Forum
Ноябрь 24, 2024, 21:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вывод в консоль из потока (TcpServer) (HELP)  (Прочитано 3177 раз)
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);
}



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

Сообщений: 480



Просмотр профиля
« Ответ #1 : Май 23, 2016, 12:41 »

Cудя по всему у тебя сервер(а) стартует в основном потоке, и так как qtin(...) блокирует поток ожиданием ввода с консоли, тупо дело до void server1::incomingConnection(qintptr socketDescriptor) не доходит. Попробуй перенести сервер(а) в отдельный поток, в принципе в том же дополнительном потоке можно и клиентов обрабатывать, не городя поток на соединение. Ну и проверяй через QThread::currentThread() что всё это действительно работает в разных потоках.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
f00rZik
Гость
« Ответ #2 : Май 23, 2016, 13:57 »

К сожалению если пихаю сервер в новый поток, то происходит SIGSEGV - Segmentation fault
И всё падает.
Записан
f00rZik
Гость
« Ответ #3 : Май 23, 2016, 14:02 »

Хотя, нет сделал ошибку в коде уже нашёл, но в новом потоке всё равно ничего не выводит Улыбающийся
Всё то-же самое.
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #4 : Май 24, 2016, 21:34 »

Хотя, нет сделал ошибку в коде уже нашёл, но в новом потоке всё равно ничего не выводит Улыбающийся
Всё то-же самое.
Давай полностью проекты клиента и сервера в студию, очевидно что ты что то делаешь не так, вывод в консоль блокироваться не должен.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 23.