crossplatform.ru

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


  Ответ в Exec threads etc...
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
me Дата 2.3.2009, 18:20
  Последовательность ID действительно одна для всех объектов QFtp ((
Прийдётся через currentThreadId и дальнейший анализ что за команда выполняется.. меня вот кстати всегда мучал вопрос а не может ли случиться так,
что если мы ловим сигнал от commandStarted и в слоте вызываем currentThreadId не может ли она хотя бы теоретически вернуть другую команду...
me Дата 2.3.2009, 17:49
  Забыл вырезать из вывода QFtp(0x80564b0) - эт я решил в какой=то момент посмотреть на адреса объектов QFtp для каждого потока...
SABROG Дата 2.3.2009, 17:47
  Рекомендация по поводу использования NULL: http://www.prog.org.ru/topic_7458_0.html
me Дата 2.3.2009, 16:35
  В продолжение этой темы.. как-то всё не доходили руки сесть за всё это, но как наконец-то сел начались новые непонимания..


Вначале код:
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 () + слоты на запуск команды и конец команды...? Что я делаю не так??
Константин Дата 18.2.2009, 18:02
 
Цитата(Гость_me_* @ 18.2.2009, 17:41) *
Всем спасибо!

жми соответствующую кнопочку :)
me Дата 18.2.2009, 17:41
  Всем спасибо! Тему я думаю на этом закрыть можно..
Константин Дата 18.2.2009, 16:49
 
Цитата(Гость_me_* @ 18.2.2009, 16:42) *
а дальше уже ловить успешное подключение и действовать дальше ?

не забыв конечнео же сделать connectы всё какие нужно...

именно. в таком случае при невозможности соединиться (connectToHost) можно выйти и завершить поток, даже не запуская его петлю событий (т.к. вряд ли тебе нужен поток с неподключённым фтп-клиентом)
me Дата 18.2.2009, 16:48
 
Цитата
Классы QHttp и QFtp предоставляют поддержку протоколов HTTP и FTP на клиентской стороне. Так как эти два протокола используются для решении похожих задач, классы QHttp и QFtp имеют много общих особенностей:

* Неблокирующее поведение. QHttp и QFtp асинхронны. Вы можете отправить ряд команд (также называемые "запросы" для HTTP). Команды выполнятся позже, когда управление вернется к циклу событий Qt.
* ID команд. Каждая команда имеет свой уникальный номер ID, который используется для слежения за выполнением команд. Например, QFtp передает сигналы commandStarted() и commandFinished() с ID команды для каждой выполняемой команды. У QHttp тоже имеются подобные сигналы requestStarted() и requestFinished().
* Индикаторы процесса передачи данных. QHttp и QFtp посылают сигналы при передаче данных (QFtp::dataTransferProgress(), QHttp::dataReadProgress() и QHttp::dataSendProgress()). Вы можете соединить данные сигналы, например, с QProgressBar::setProgress() или QProgressDialog::setProgress().
* Поддержка QIODevice. Оба класса поддерживают загрузку в и скачивание из QIODevice, дополнительно к API, основанному на QByteArray.

Есть два основных способа использования QHttp и QFtp. Самый обычный способ состоит в том, чтобы отслеживать ID команд и следить за выполнением каждой команды, соединившись с соответствующим сигналом. Другой способ состоит в том, чтобы запланировать все команды сразу и соединиться только с сигналом done(), который посылается, когда все команды были выполнены. Первый способ требует большего количества работы, но дает больший контроль над выполнением конкретных задач и позволяет вводить дополнительные команды, основанные на результате предыдущих. Что позволяет обеспечить пользователю детализированную обратную связь.

Чёрт, как-то забыл совсем что есть общая статья про сетевое взаиможействие и совсем упустил из виду что тамCC написанно.
me Дата 18.2.2009, 16:43
  не забыв конечнео же сделать connectы всё какие нужно...
me Дата 18.2.2009, 16:42
 
Цитата(Константин @ 18.2.2009, 16:35) *
по всей видимости, тут ещё имеют место проблемы с пониманием асинхронное работы сокетов кутэ.


Так оно и есть...

Цитата(Константин @ 18.2.2009, 16:35) *
тем более, что ftp будет создан в родительском потоке


Я там торопился... не указатель а просто
QFtp ftp;

Тоесть сделать так:
void MyThread::run()
{
QFtp ftp;
ftp.connectToHost("ftp.trolltech.com");
exec();
}


а дальше уже ловить успешное подключение и действовать дальше ?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 20.4.2024, 13:42