crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Exec threads etc...
Гость_me_*
сообщение 17.2.2009, 23:03
Сообщение #1





Гости








    


Доброго времени суток..
Не так давно начал разбираться с взаимодействием потоков в qt и осознал что оч мощно запутался.
Есть задача: написать многопотоный ftp клиент который парсит файлик с заданиями и закачивает с разных ftp ресурсов файлы. Многопоточный просто для того чтобы самому в этом хорошенько разобраться. Решил организовать это следующим образом на каждое задание создаётся поток и далее вся работа через QFtp. Насколько я понял QFtp асинхронный, а так как мне требуется помимо непосредственно работы с ftp в этом же потоке обрабатывать некоторые действия со скачанными файлами то требуется вынести это в соотвествующие слоты. Не понятно мне стало вот что:
- насколько я понимаю слоты прикреплённые к соотвествующим сигналам из Qftp НЕ будет выполнятся до тех пор пока не будет вызван exec в потоке? Но тогда я так понима.ю мне придётся как минимум обращаться к потоку из главного потока дважды. Первый раз на старт потока а второй на запуск задания (просто слот с перечнем комманд на коннект и на скачку)
- получается что всю работу с ftp надо будет полностью выносить в отдельные слоты, что видится мне несколько грамоздким.

Вообщем требуется квалифицированная помощь)))
з.ы. Заранее хочу сказать, что листал книги по qt, читал документацию, но разобрался не во всём и эти моменты для меня туманны, так что просьба к великому гуглу не отсылать)))
з.з.ы Какой-нибудь простенький пример будет оч кстати.. ток главный смысл в том что программа будет автоматизированна и без участие человека и без гуи... так что явный инициатор QFtp c точки зрения запуска заданий отсуствует..
Заранее спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Гость_me_*
сообщение 2.3.2009, 16:35
Сообщение #2





Гости








    


В продолжение этой темы.. как-то всё не доходили руки сесть за всё это, но как наконец-то сел начались новые непонимания..


Вначале код:
FtpThread.h:
#include "FtpThread.h"

void FtpThread::run()
{
    // определение и инициализация соединения
    ftpConnection = new QFtp();
    connect(ftpConnection, SIGNAL(commandFinished(int, bool)), this, SLOT(commandManage(int, bool)), Qt::DirectConnection);
    ftpConnection->connectToHost(this->server);
    qDebug() << "Thread" << QThread::currentThreadId();
    exec();
    }

FtpThread::FtpThread(QString *server, QString *login, QString *pass)
{
    if (server == NULL)
;                    //  пока без этого..
    else
        this->server = *server;
    if (login == NULL)
        this->login="anonymous";
    else
        this->login = *login;
    if (pass == NULL)
        this->pass = "password";
    else
        this->pass = *pass;
    ftpConnection = NULL;
}
void FtpThread::commandManage(int command, bool isError)
{
    if (isError == true)
    {
        qDebug() << "Error:" << command << ftpConnection->errorString();
        return;
    }
    else
    {
        switch(command)
        {
            case 1:        // connectToHost прошёл успешно.. логинимся
                qDebug() << "Loging 1" << QThread::currentThreadId();
                ftpConnection->login(this->login, this->pass);
                return;
            case 2:
                qDebug() << "Logged In 2" << QThread::currentThreadId();
                ftpConnection->close();
                return;
            case 3:
                qDebug() << "Closed 3" << QThread::currentThreadId();
                quit();
                return;
            default:
                qDebug() << "OPPA!!" << command << QThread::currentThreadId();
                return;
        }
    }

}

FtpThread.cpp
#ifndef FTPTHREAD_H_
#define FTPTHREAD_H_

#include <QtNetwork>
#include <QCoreApplication>
#include <QQueue>

// Тип загрузки. С сервера или на сервер.
enum LoadDirection {TO_THE_SERVER, FROM_THE_SERVER};

class FtpThread : public QThread
{
    Q_OBJECT

public:
    FtpThread(QString *server = NULL , QString *name = NULL, QString *pass = NULL);

public slots:
    void commandManage(int, bool);

protected:
    void run();

private:
    // настройки подключения к серверу
    QString server;
    QString login;
    QString pass;
    LoadDirection load;

    // (up/down)load settings
    QString from;
    QString to;

    // Ftp соединение.
    QFtp *ftpConnection;

    // Задания
    QQueue<QString> tasks;
};
#endif /* FTPTHREAD_H_ */

main.cpp
#include <QtCore>
#include <QtNetwork>
#include <QCoreApplication>
#include "FtpThread.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString host = "ftp.freebsd.org";
    QString user = "anonymous";
    QString pass = "pass";
    QString dir  = "/pub/FreeBSD/";

    qDebug() << "Main thread" << QThread::currentThreadId();

    FtpThread ftpWorker(&host);
    FtpThread ftpWorker2(&host);
    ftpWorker.start();
    ftpWorker2.start();
    //ftpWorker.wait();
//  qDebug() << QThread::currentThreadId() << "After Wait";
    return a.exec();
}


Вывод в консоль=(((

Main thread 3071719120 
Thread           3070524304 QFtp(0x80564b0)
Thread           3053738896 QFtp(0x805d8c0)
Loging 1        3070524304 QFtp(0x80564b0)
Logged In 2  3053738896 QFtp(0x805d8c0)
OPPA!! 4       3053738896 QFtp(0x805d8c0)
Closed 3       3070524304 QFtp(0x80564b0)


Толи на оба QFtp даётся общая последовательность ID команд.. толи не знаю. Если это так то очевидно лучше использовать
currentCommand () + слоты на запуск команды и конец команды...? Что я делаю не так??
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- me   Exec threads etc...   17.2.2009, 23:03
- - ViGOur   Работу с FTP не нужно выносить в отдельные слоты. ...   17.2.2009, 23:36
|- - me   Цитата(ViGOur @ 17.2.2009, 23:36) А тепер...   18.2.2009, 0:17
- - SABROG   Цитата(Гость_me_* @ 18.2.2009, 0:17) Скаж...   18.2.2009, 0:37
|- - me   Цитата(SABROG @ 18.2.2009, 0:37) Цитата(Г...   18.2.2009, 1:01
- - SABROG   Цитата(Гость_me_* @ 18.2.2009, 1:01) Эмм....   18.2.2009, 1:39
|- - me   Цитата(SABROG @ 18.2.2009, 1:39) Что тако...   18.2.2009, 9:16
- - SABROG   Это из-за того, что QAbstrackSocket не блокирующий...   18.2.2009, 9:38
|- - me   Цитата(SABROG @ 18.2.2009, 9:38) Это из-з...   18.2.2009, 9:51
- - Константин   Гость_me_*, для испускания сигналов петля событий ...   18.2.2009, 14:46
|- - me   Цитата(Константин @ 18.2.2009, 14:46) Гос...   18.2.2009, 15:14
- - SABROG   Цитата(Гость_me_* @ 18.2.2009, 9:51) Эх.....   18.2.2009, 14:58
- - SABROG   Цитата(Гость_me_* @ 18.2.2009, 15:14) Так...   18.2.2009, 15:45
|- - me   Цитата(SABROG @ 18.2.2009, 15:45) Таким о...   18.2.2009, 16:35
- - Константин   по всей видимости, тут ещё имеют место проблемы с ...   18.2.2009, 16:35
|- - me   Цитата(Константин @ 18.2.2009, 16:35) по ...   18.2.2009, 16:42
- - me   не забыв конечнео же сделать connectы всё какие ну...   18.2.2009, 16:43
- - me   ЦитатаКлассы QHttp и QFtp предоставляют поддержку ...   18.2.2009, 16:48
- - Константин   Цитата(Гость_me_* @ 18.2.2009, 16:42) а д...   18.2.2009, 16:49
- - me   Всем спасибо! Тему я думаю на этом закрыть мож...   18.2.2009, 17:41
- - Константин   Цитата(Гость_me_* @ 18.2.2009, 17:41) Все...   18.2.2009, 18:02
- - me   В продолжение этой темы.. как-то всё не доходили р...   2.3.2009, 16:35
|- - me   Забыл вырезать из вывода QFtp(0x80564b0) - эт я р...   2.3.2009, 17:49
- - SABROG   Рекомендация по поводу использования NULL: http://...   2.3.2009, 17:47
- - me   Последовательность ID действительно одна для всех ...   2.3.2009, 18:20


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 10:29