LINUX.ORG.RU

<Qt4><консольное приложение> чтение данных с QTcpSocket

 ,


0

2

Так в консольном приложении не выполняется обработка событий сокета не удается получить сигнал readyRead(). С потоком тоже не вышло, ковыряюсь целый день. Кто что может подсказать по этому поводу, как реализовать. Нужно принимать данные в отдельном цикле от приложения.

★★★

Последнее исправление: pozitiffcat (всего исправлений: 1)

Ответ на: комментарий от panter_dsd

потому что

QCoreApplication a(argc, argv);
//код
//гдето тут нужно ловить сигналы
a.exec();//тут обработка событий
вобщем не ловится не один сигнал... в гуйном приложении все ок

pozitiffcat ★★★
() автор топика
#include <QCoreApplication>


int main(int argc, char** argv)
{
    QCoreApplication app(argc, argv);

    return app.exec();
}

В результате вызова app.exec() запускается процесс ожидания и обработки сообщений, так что readyRead() должен обрабатываться.

m0rph ★★★★★
()
Ответ на: комментарий от pozitiffcat

До a.exec() ничего работать и не будет.

Читайте Шлее, у него есть пример работы с сетью из консоли.

unfo ★★★★★
()
Ответ на: комментарий от pozitiffcat

ссылка номер 8: Программирование на C, C++, Java, .NET » Макс Шлее...

anonymous
()

QMetaObject::invoke(object, «Method», QQueuedConnection).

Писал по памяти, точно смотри в мане.

anonymous
()
Ответ на: комментарий от unfo

processEvents вообще стремная штука, ее поведение зависит от платформы. Лучше всегда использовать честный QEventLoop

annulen ★★★★★
()

Давай минимально [не]рабочий пример кода или посмотри примеры в сети.

Chaser_Andrey ★★★★★
()

Можете привести код или показать в этом коде что не правильно сделано?
thread.h:

#ifndef THREAD_H
#define THREAD_H
#include <QDebug>
#include <QThread>
#include <QTcpSocket>
#include <QMutex>
class Thread : public QThread {
    Q_OBJECT
public:
    explicit Thread(QObject *parent = 0): QThread(parent) {
        mutex.lock();
        connect(&socket,SIGNAL(connected()),SLOT(connected()));
        connect(&socket,SIGNAL(readyRead()),SLOT(readyread()));
        connect(&socket,SIGNAL(disconnected()),SLOT(disconnect()));
    }
private:
    void run() {
        socket.connectToHost("ya.ru",80);
        QMutexLocker locker(&mutex);
    }
public slots:
    void connected() { socket.write("GET / HTTP/1.0\r\n\r\n"); }
    void readyread() { qDebug()<<socket.readAll(); }
    void disconnect() { mutex.unlock(); }
private:
    QTcpSocket socket;
    QMutex mutex;
};
#endif // THREAD_H

main.cpp:
#include <QtCore/QCoreApplication>
#include <thread.h>
int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    Thread thread;
    thread.start();
    a.connect(&thread,SIGNAL(finished()),SLOT(quit()));

    return a.exec();
}

anonymous
()
Ответ на: комментарий от panter_dsd

Очевидно же, что бы показать что сигналы работают

anonymous
()
Ответ на: комментарий от anonymous

Некоторый оффтоп

>You shouldn’t …
>… add slots to a QThread subclass: they’ll be invoked from the “wrong” thread, that is, not the one the QThread object is managing, but the one that object is living in, forcing you to specify a direct connection and/or to use moveToThread(this).

http://qt-project.org/wiki/Threads_Events_QObjects

Deleted
()
Ответ на: комментарий от anonymous

return a.exec();

Вот это выполняется - поэтому ты можешь получать сигналы. А у меня до этой строчки не доходит, потому что у меня в цикле идет опрос действий пользователя, а работать с QTcpSocket надо, надо получать сигнал readyRead()

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

или вручную вызывай обработчик сигналов: QCoreApplication::processEvents(); но это не хорошо

anonymous
()
Ответ на: комментарий от unC0Rr

Переделал на гуй. Просто то приложение которое я делал, по сети коннектится с банковским приложением.. консоль нужна была только для отладки (модули должны использоваться в другом существующем приложении на Qt), раз уж произошла такая трабла переделал на гуй.

pozitiffcat ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.