Russian Qt Forum
Сентябрь 21, 2024, 05:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFtp синхронная работа  (Прочитано 5281 раз)
thechicho
Гость
« : Январь 01, 2012, 19:50 »

можно как-то сабж сделать?
чтобы слоты не городить, а в одном слоте все обрабатывать?

например, реально как-то синхронно (имеется в виду в 1 слоте) получить список файлов фтп сервера?
Записан
thechicho
Гость
« Ответ #1 : Январь 01, 2012, 20:06 »

Код
C++ (Qt)
  ftp = new QFtp;
 
   qRegisterMetaType<QUrlInfo>("QUrlInfo");
   connect(ftp, SIGNAL(listInfo(QUrlInfo)), this, SLOT(addToList(QUrlInfo)));
 
   ftp->setTransferMode(QFtp::Passive);
   ftp->connectToHost("ftp.host.ru");
   ftp->login(login, password);
 
   QEventLoop loopFTP;
 
   connect(ftp, SIGNAL(commandFinished(int,bool)), &loopFTP, SLOT(quit()));
   loopFTP.exec();
 
   connect(ftp, SIGNAL(commandFinished(int,bool)), &loopFTP, SLOT(quit()));
   loopFTP.exec();
 
   connect(ftp, SIGNAL(commandFinished(int,bool)), &loopFTP, SLOT(quit()));
   loopFTP.exec();
 
   ftp->list();
 
   connect(ftp, SIGNAL(commandFinished(int,bool)), &loopFTP, SLOT(quit()));
   loopFTP.exec();
 
   qDebug() << filesFTP;
 
   ftp->deleteLater();
   return;
 
void thread::addToList(const QUrlInfo &urlInfo)
{
   qDebug() << "TEST addLIST" << urlInfo.name() << urlInfo.size() << urlInfo.owner() << urlInfo.lastModified(); // << urlInfo.lastModified().toString("MMM dd yyyy");
   filesFTP.append(urlInfo.name());
}

пока ток так рабочий вариант удалось получить.
но я не догоняю как мне прочитать список, без сигнала SIGNAL(listInfo(QUrlInfo))
Записан
neversleep
Гость
« Ответ #2 : Январь 02, 2012, 20:09 »

Цитировать
void QFtp::done ( bool error ) [signal]

This signal is emitted when the last pending command has finished; (it is emitted after the last command's commandFinished() signal). error is true if an error occurred during the processing; otherwise error is false.
---

added:

То есть можно попробовать так:
Код
C++ (Qt)
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
private:
   Ui::MainWindow *ui;
 
   QStringList m_filesFTP;
 
public slots:
   void addToList(const QUrlInfo &urlInfo)
   {
       m_filesFTP.append(urlInfo.name());
   }
};
 
 
...
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   QEventLoop *loop = new QEventLoop;
   QFtp *ftp = new QFtp;
 
   ftp->setTransferMode(QFtp::Passive);
   ftp->connectToHost(...);
   ftp->login();
 
   connect(ftp, SIGNAL(listInfo(const QUrlInfo&)), this, SLOT(addToList(const QUrlInfo&)));
   connect(ftp, SIGNAL(done(bool)), loop, SLOT(quit()));
 
   ftp->list("/pub");
   loop->exec();
 
   qDebug() << m_filesFTP;
}
 
« Последнее редактирование: Январь 02, 2012, 20:16 от neversleep » Записан
thechicho
Гость
« Ответ #3 : Январь 02, 2012, 22:03 »

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

Код
C++ (Qt)
QEventLoop loopFTP;
QTimer::singleShot(15000, &loopFTP, SLOT(quit()));
connect(ftp, SIGNAL(done(bool)), &loopFTP, SLOT(quit()));
loopFTP.exec();

но почему, он не встроен в connectToHost() ?
это типа баг? ведь если таймаут не указать, то криндец, ничего не происходит.
Записан
neversleep
Гость
« Ответ #4 : Январь 03, 2012, 05:56 »

См описание ф-ции QFtp::connectToHost:

Цитировать
Connects to the FTP server host using port port.

The stateChanged() signal is emitted when the state of the connecting process changes, e.g. to HostLookup, then Connecting, then Connected.

The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished().

When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted.

See also stateChanged(), commandStarted(), and commandFinished().

То есть сначала убедить что соединение установлено, потом всё остальное.

Вообще конечно что надо проверять результаты сигналов/ф-ций, и действовать по ситуации. КЭП.
Записан
thechicho
Гость
« Ответ #5 : Январь 03, 2012, 23:13 »

спасибо, кэп Улыбающийся
в общем так и оставил пока, работает так, как я и хотел, остальное история (пох.!.)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.104 секунд. Запросов: 21.