Привет. В Qt я новичек. С многопоточностью (в Qt) только столкнулся.
Как лучше реализовать такую задачу:
Есть TCP 4 сервера. Нужно к каждому из них подключаться (независимо), делать запросы и получать данные.
Резонно что на каждое TCP соединение имеет смысл выделить по потоку.
class QMMNClientThread : public QThread
{
Q_OBJECT
QTcpSocket * fmmnClient; //сетевой клиент
QTimer * freqTimer; //таймер, в котором надо переодически слать запрос на сервер (каждые 250мс)
void run();
public:
explicit QMMNClientThread(QObject *parent = 0);
~QMMNClientThread();
QString remoteHost;
quint16 remotePort;
signals:
public slots:
private slots:
void readyRead();
void onConnected();
void onDisconnected();
void onError();
void doRequest();
};
вот моя реализация класса
#include <memory.h>
#include <QObject>
#include "mmn_client.h"
#include "qmmnclientthread.h"
QMMNClientThread::QMMNClientThread(QObject *parent) :
QThread(parent)
{
remoteHost = "127.0.0.1";
remotePort = 10000;
freqTimer = new QTimer;
freqTimer->setInterval(250);
fmmnClient->moveToThread(this);
freqTimer->moveToThread(this);
connect(fmmnClient,SIGNAL(connected()),this,SLOT(onConnected()));
connect(fmmnClient,SIGNAL(disconnected()),this,SLOT(onDisconnected()));
connect(fmmnClient,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(onError()));
connect(fmmnClient,SIGNAL(readyRead()),this,SLOT(readyRead()));
connect(freqTimer,SIGNAL(timeout()),this,SLOT(doRequest()));
}
QMMNClientThread::~QMMNClientThread()
{
freqTimer->stop(); //надо остановить таймер
fmmnClient->close(); //закрыть соединение
delete fmmnClient; //удалить объекты
delete freqTimer;
if(frawBuffer) free(frawBuffer); //освободить память буфера приема
}
void QMMNClientThread::run()
{
fmmnClient->connectToHost(remoteHost,remotePort); //первая попытка соединения
exec(); //запускаю петлю событий потока
}
void QMMNClientThread::readyRead()
{
//здесь буду обрабатывать принятые данные (порядка 4Кб)
}
void QMMNClientThread::onConnected()
{
//при подключении к серверу начинаю делать запросы данных
freqTimer->start(250);
}
void QMMNClientThread::onDisconnected()
{
//если сервер отключил, то
freqTimer->stop(); //остановить запросы
fmmnClient->close(); //закрыть сокет
sleep(freconnTimeot); //ждем 2 секунды
fmmnClient->connectToHost(remoteHost,remotePort); //пытаемся подключиться
}
//пока тоже самое как и при отключении
void QMMNClientThread::onError()
{
freqTimer->stop();
fmmnClient->close();
sleep(freconnTimeot);
fmmnClient->connectToHost(remoteHost,remotePort);
}
void QMMNClientThread::doRequest()
{
//здесь надо отправить небольшой пакет данных по этому же сокету
}
Проблема возникает при вызове деструктора
QMMNClientThread::~QMMNClientThread()
{
freqTimer->stop(); //надо остановить таймер
fmmnClient->close(); //закрыть соединение <<--------здесь вылетает окно с аварийным закрытием программы
delete fmmnClient; //удалить объекты
delete freqTimer;
if(frawBuffer) free(frawBuffer); //освободить память буфера приема
}
Я понимаю что моя тема уже избита и стара как г-но мамонта, но как мне создать сокет, что бы можно было к нему обращаться не только в run()?