Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QCoreApplication QTcpSocket readyRead() signal ?

QCoreApplication QTcpSocket readyRead() signal ?

Scheduled Pinned Locked Moved General and Desktop
3 Posts 2 Posters 1.9k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • R Offline
    R Offline
    redradist
    wrote on last edited by redradist
    #1

    The problem is that:
    I have QTcpSocket Application and in GUI mode it works, but when I set console parameters QTcpSocket does not emit readyRead() signal !!!!
    I'm working in Ubuntu 12.04

    QTcpServer:

    /* 
     * New client connection 
     */
    void SenseSystem::TechServer::newclient()
    {
        // If server started
        qDebug() << QString::fromUtf8("New connection!!!");
    
        qintptr IDSocket = tcpServer->nextPendingConnection()->socketDescriptor();
    
        QThread *thread = new QThread();
        Client *client = new Client(IDSocket);
        client->moveToThread(thread);
        connect(thread,SIGNAL(started()),client,SLOT(process()));
        connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));
        connect(client,SIGNAL(finished()),thread,SLOT(quit()));
        connect(client,SIGNAL(finished()),client,SLOT(deleteLater()));
        if(config.typeView == CONSOLE)
        {
            connect(client,SIGNAL(println(QString)),(Console *)config.display,SLOT(outStream(QString)));
            connect(client,SIGNAL(addClientToList(int)),(Console *)config.display,SLOT(addClientToList(int)));
        }
        else if(config.typeView == WINDOW)
        {
            connect(client,SIGNAL(println(QString)),((MainWindow *)config.display),SLOT(outStream(QString)));
            connect(client,SIGNAL(addClientToList(int)),(MainWindow *)config.display,SLOT(addClientToList(int)));
        }
        connect(client,SIGNAL(removeClientFromList(int)),this,SLOT(removeMap(int)));
    
        SenseSystem::TechServer::client.insert(IDSocket,client);
        thread->start();
    }
    

    QTcpSocket:

    /* 
     * Run the thread 
    */
    void SenseSystem::Client::process(void)
    {
        clientSocket = new QTcpSocket();
        // Trying to connect to socket descriptor
        if (!clientSocket->setSocketDescriptor(socketDescriptor))
        {
            // Can't connect to socket descriptor
            finished();
        }
        else
        {
            sql = new MainSQL("localhost","postirayka",
                              "root","root");
            // Initiolization settings for system
            timer = new QTimer(this);
            // setup signal and slot
            connect(timer,SIGNAL(timeout()),this,SLOT(readCommand()));
            // Reading command from MySQL
            timer->start(2000);
           // Initiolization settings for system
            autoriz = new QTimer(this);
            // setup signal and slot
            connect(autoriz,SIGNAL(timeout()),this,SLOT(finishThread()));
            // Reading command from MySQL
            autoriz->start(20000);
            // Initiolization settings for system
            timAlive = new QTimer(this);
            // setup signal and slot
            connect(timAlive,SIGNAL(timeout()),this,SLOT(finishThread()));
            // Reading command from MySQL
            timAlive->start(600000);
            timModem = new QTimer(this);
            // setup signal and slot
            connect(timModem,SIGNAL(timeout()),this,SLOT(readModem()));
            // Reading command from MySQL
            timModem->start(50000);
            timBufClear = new QTimer(this);
            // setup signal and slot
            connect(timBufClear,SIGNAL(timeout()),this,SLOT(bufferClear()));
            // Starting the thread of socket to execute events
            connect(clientSocket,SIGNAL(readyRead()),this, SLOT(socketReadClient()));
            connect(clientSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this, SLOT(clientChangeState()));
            connect(clientSocket,SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(socketErrorClient()));
            connect(clientSocket,SIGNAL(disconnected()),this, SLOT(socketRemoveClient()));
            // String to window
            QString strSocket;
            strSocket += QString("[") + QString::number(socketDescriptor) + "] New connection!!!" + "\r\n\r\n";
            // Set text to the text browser
            println(strSocket);
        }
    }
    

    Selected view:

        // Checking if we need console application
        if(config.typeView == SenseSystem::CONSOLE)
        {
            QCoreApplication app(argc, argv);
            config.display = new Console(app.arguments());
            // Return end of application
            return app.exec();
        }
        // Checking if we need window application
        else
        {
            QApplication app(argc, argv);
            config.display = new MainWindow();
            ((MainWindow *) config.display)->show();
            // Return end of application
            return app.exec();
        }
    

    Console class:

    /*
     * Constructor console task
     */
    Console::Console(QStringList agruments,QObject *parent) :
            QObject(parent)
    {
        Console::agruments = agruments;
        // Function of fetch of user interface
        server = new SenseSystem::TechServer(config.port);
        connect(this,SIGNAL(println(QString)),this,SLOT(outStream(QString)));
        // Checking if server is started ?
        if(server != NULL)
        {
            // Set text to the text browser
            println("Server is working!\r\n");
            println("UTC: "+QDateTime::currentDateTimeUtc().toString()+"\r\n");
        }
        // If server isn't working
        else
        {
            // Set text to the text browser
            println("Server isn\'t working!!!\r\n");
            println("Please check the internet connection\r\n");
        }
    }
    
    1 Reply Last reply
    0
    • L Offline
      L Offline
      LuGRU
      wrote on last edited by
      #2

      You didn't show socketReadClient() slot plus please use formatting this will make Your code more readable.
      Check if config.display in both cases is correctly set, check if outStream() in Console is correctly set.

      1 Reply Last reply
      0
      • R Offline
        R Offline
        redradist
        wrote on last edited by redradist
        #3

        socketReadClient() - is specialized slot of handling packets.

        /*
         * Recive of the request to the server
         */
        void SenseSystem::Client::socketReadClient(void)
        {
            // Try to do something with the socket
            try {
                // Buffer read of client
                buffer.insert(buffer.size(),clientSocket->readAll());
        

        But It's not necessary, in Ubuntu do not working QThread.
        I'm do some changes:

        QThread *thread = new QThread(this);
                    clientSocket->moveToThread(thread);
                    Client *client = new Client(clientSocket,sql,IDSystem);
                    client->moveToThread(thread);
                    connect(thread,SIGNAL(started()),client,SLOT(process()));
                    connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));
                    connect(client,SIGNAL(finished()),thread,SLOT(quit()));
                    connect(client,SIGNAL(finished()),client,SLOT(deleteLater()));
                    // Starting the thread of socket to execute events
                    connect(clientSocket,SIGNAL(readyRead()),client, SLOT(socketReadClient()));
                    connect(clientSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),client, SLOT(clientChangeState()));
                    connect(clientSocket,SIGNAL(error(QAbstractSocket::SocketError)),client, SLOT(socketErrorClient()));
                    connect(clientSocket,SIGNAL(disconnected()),client, SLOT(socketRemoveClient()));
                    if(config.typeView == CONSOLE)
                    {
                        connect(client,SIGNAL(println(QString)),((Console *)config.display),SLOT(outStream(QString)));
                        connect(client,SIGNAL(addClientToList(qintptr)),((Console *)config.display),SLOT(addClientToList(qintptr)));
                    }
                    else if(config.typeView == WINDOW)
                    {
                        connect(client,SIGNAL(println(QString)),((MainWindow *)config.display),SLOT(outStream(QString)));
                        connect(client,SIGNAL(addClientToList(qintptr)),((MainWindow *)config.display),SLOT(addClientToList(qintptr)));
                    }
                    connect(client,SIGNAL(removeClientFromList(qintptr)),this,SLOT(removeMap(qintptr)));
        
                    SenseSystem::TechServer::client.insert(socketDescriptor,client);
                    thread->start();
        

        I can do this, because I have overloaded incomingConnection(qintptr socketDescriptor) function. But in Ubuntu Console mode QTcpSocket in new thread do not recieve readyRead() signal, this signal come in the main thread. But how do catching readyRead() in new thread ????
        In Ubuntu Desktop mode the code is worked !

        1 Reply Last reply
        0

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved