crossplatform.ru

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

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Exec threads etc...
SABROG
  опции профиля:
сообщение 18.2.2009, 14:58
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(Гость_me_* @ 18.2.2009, 9:51) *
Эх.. а с блокирующими сокетами было бы всё несколько проще..


Для этого были созданы такие методы:

bool waitForConnected ( int msecs = 30000 )
bool waitForDisconnected ( int msecs = 30000 )
virtual bool waitForReadyRead ( int msecs = 30000 )

Т.е. все блокируется на 30 секунд, а там уже можешь либо повторить попытку, либо пользователю выдать еrror.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_me_*
сообщение 18.2.2009, 15:14
Сообщение #12





Гости








    


Цитата(Константин @ 18.2.2009, 14:46) *
Гость_me_*,
петля событий потоку необходима, если в этом потоке требуется асинхронно выполнять слоты.


Так у меня и получается что на асинхронный сигнал QFtp надо вызывать слот в этом же потоке.. (например как я уже говорил для анализа и работы листинга директории)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 18.2.2009, 15:45
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(Гость_me_* @ 18.2.2009, 15:14) *
Так у меня и получается что на асинхронный сигнал QFtp надо вызывать слот в этом же потоке.. (например как я уже говорил для анализа и работы листинга директории)


Соединяй нужные сигналы от QFtp со слотами QThread и выполняй exec() в run(). Все, что будет одти до exec - выполняется один раз при запуске потока, потом exec() входит в "бесконечный" цикл, т.е. возврата из run() не будет до тех пор, пока не будет выход из eventloop, а это произойдет уже при завершении потока. Таким образом все слоты будут обрабатываться не до и не после exec, а во время.

QFtp::list() и прочие команды возвращают свой уникальный ID команды. Можно использовать этот номер, чтобы отслеживать, когда команда завершится. До завершения команды у тебя будут приходить сигналы listInfo(), можно его обрабатывать и заполнять свой список нужным образом, отсортировывая не нужное. В конце придет сигнал commandFinished(int id), IDшник сравниваешь с IDшником возвращенным от list()'a и если это он, то начинаем выкачивать файлы по одному из своего списка. Удаляя выкаченные файлы из списка. На завершение выкаченных файлов тоже будут приходить сигналы со своим id, там ты и будешь удалять из своего списка то, что скачалось. Когда список станет нулевым можно закрыть соединение QFtp::close(), удалить экземпляр QFtp::deleateLater() и завершить поток, т.е. сделать тот самый выход из exec() - quit()/exit(0).

Сообщение отредактировал SABROG - 18.2.2009, 16:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Константин
  опции профиля:
сообщение 18.2.2009, 16:35
Сообщение #14


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 9.2.2009
Пользователь №: 539

Спасибо сказали: 15 раз(а)




Репутация:   1  


по всей видимости, тут ещё имеют место проблемы с пониманием асинхронное работы сокетов кутэ.

Цитата
void MyThread::run()
{
QFtp ftp = new QFtp;
ftp->connectToHost("ftp.trolltech.com");
ftp->login();
ftp->list();
......
ftp->close();
exec();
}

так делать не нужно. тем более, что ftp будет создан в родительском потоке. вызывай exec(), а всю работу с фтп вынеси из run()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_me_*
сообщение 18.2.2009, 16:35
Сообщение #15





Гости








    


Цитата(SABROG @ 18.2.2009, 15:45) *
Таким образом все слоты будут обрабатываться не до и не после exec, а во время.


Тоесть начиная с того как был вызван непосредственно exec и мы вошли в event loop и до тех пока не вызовем завершить поток,
Цитата(SABROG @ 18.2.2009, 15:45) *
т.е. сделать тот самый выход из exec() - quit()/exit(0)


Большое спасибо!!! По этому поводу все вопросы в сущности и были)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_me_*
сообщение 18.2.2009, 16:42
Сообщение #16





Гости








    


Цитата(Константин @ 18.2.2009, 16:35) *
по всей видимости, тут ещё имеют место проблемы с пониманием асинхронное работы сокетов кутэ.


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

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


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

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


а дальше уже ловить успешное подключение и действовать дальше ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_me_*
сообщение 18.2.2009, 16:43
Сообщение #17





Гости








    


не забыв конечнео же сделать connectы всё какие нужно...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_me_*
сообщение 18.2.2009, 16:48
Сообщение #18





Гости








    


Цитата
Классы 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 написанно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Константин
  опции профиля:
сообщение 18.2.2009, 16:49
Сообщение #19


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 9.2.2009
Пользователь №: 539

Спасибо сказали: 15 раз(а)




Репутация:   1  


Цитата(Гость_me_* @ 18.2.2009, 16:42) *
а дальше уже ловить успешное подключение и действовать дальше ?

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

именно. в таком случае при невозможности соединиться (connectToHost) можно выйти и завершить поток, даже не запуская его петлю событий (т.к. вряд ли тебе нужен поток с неподключённым фтп-клиентом)

Сообщение отредактировал Константин - 18.2.2009, 16:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_me_*
сообщение 18.2.2009, 17:41
Сообщение #20





Гости








    


Всем спасибо! Тему я думаю на этом закрыть можно..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 29.11.2024, 19:01