Хочу понять, как правильно работать с тредами. Почитав книги по qt4, понял мало, там очень сухо всё описано.
Хочу сделать тред, в котором будет проходить закачка файла.
Соответственно, при создании в него должны передаваться параметры - откуда и куда качать файл.
Значит в треде должны быть свои сигналы и слоты.
В методе треда run() последней строчкой стоит exec()
Если стартовать тред с помощью start(), то он запускается и сразу же помирает, не скачав и байта (тред не ловит ни слотов, ни сигналов). Если запускать с помощью run(), то тред отрабатывает, но после отработки тред виснет, т.е. программа висит в ожидании. Если в программе нажать на quit, то, видимо, тред грохается и программа продолжает работать. повторное нажатие на quit срабатывает нормально.
Вероятно, я не могу выйти из EventLoop, вызов quit(), exit(0), exit() - не помогают.
Ну, и главный номер программы - мой ugly code:
тредовый .h
class get_xml : public QThread
{
Q_OBJECT
public:
get_xml (QObject *parent = 0,QStringList *_initList=0);
~get_xml ();
void run ();
private:
QHttp http;
QFile xmlfile;
QByteArray result;
QStringList* initList;
QString charfile;
private slots:
void readData();
void save2File();
signals:
void finita();
};
тредовый .cpp
get_xml::get_xml (QObject *parent,QStringList *_initList)
:initList (_initList)
{
}
void get_xml::run ()
{
qDebug ("getXML STARTED");
QHttpRequestHeader header ("GET", initList->at(1),1,1);
QByteArray opts;
connect (&http,SIGNAL (readyRead (QHttpResponseHeader)),this, SLOT (readData()));
connect (&http,SIGNAL (done (bool)),this,SLOT (save2File()));
header.setContentType("application/x-www-form-urlencoded");
header.setValue("Host", "bla-bla.com");
http.setHost ("bla-bla.com");
xmlfile.setFileName (initList->at(0)+initList->at(4)+QDir::separator()+file.fileName());
opts.append ("<ny cool opts>");
http.request (header,opts,0);
exec();
}
get_xml::~get_xml()
{
qDebug ("xml thread убилсо");
}
void get_xml::readData()
{
qDebug ("тяну-потяну XML...");
result.append (http.readAll());
void get_xml::save2File ()
{
disconnect (&http,0,0,0);
xmlfile.open (QIODevice::WriteOnly);
qDebug ()<<"downloading complete"
xmlfile.write (result);
xmlfile.close();
emit (finita());
}
В главном классе
в .h
в .cpp
myCurrSkill = new get_xml (this,&initList);
bool skillConn (false);
connect (myCurrSkill,SIGNAL (finita()),this,SLOT (charCSkillReady()));
//myCurrSkill->start();
myCurrSkill->run();
....................
.....................
void char_Sheet::charCSkillReady ()
{
disconnect (myCurrSkill,0,0,0);
myCurrSkill->quit();
myCurrSkill->deleteLater();
}