Russian Qt Forum

Qt => Работа с сетью => Тема начата: thechicho от Январь 01, 2012, 19:50



Название: QFtp синхронная работа
Отправлено: thechicho от Январь 01, 2012, 19:50
можно как-то сабж сделать?
чтобы слоты не городить, а в одном слоте все обрабатывать?

например, реально как-то синхронно (имеется в виду в 1 слоте) получить список файлов фтп сервера?


Название: Re: QFtp синхронная работа
Отправлено: thechicho от Январь 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))


Название: Re: QFtp синхронная работа
Отправлено: neversleep от Январь 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;
}
 


Название: Re: QFtp синхронная работа
Отправлено: thechicho от Январь 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() ?
это типа баг? ведь если таймаут не указать, то криндец, ничего не происходит.


Название: Re: QFtp синхронная работа
Отправлено: neversleep от Январь 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().

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

Вообще конечно что надо проверять результаты сигналов/ф-ций, и действовать по ситуации. КЭП.


Название: Re: QFtp синхронная работа
Отправлено: thechicho от Январь 03, 2012, 23:13
спасибо, кэп :)
в общем так и оставил пока, работает так, как я и хотел, остальное история (пох.!.)