crossplatform.ru

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

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





Гости








    


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

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


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Работу с FTP не нужно выносить в отдельные слоты.

Давай попробуем разделить изучение того, что тебе нужно на шаги:
1. Для лучшего понимания почитай Сигналы и слоты () (если еще не читал)

2. Глянь пример работы с ftp: FTP Example. А за одно и класс QFtp, для получения файла нужно использовать: int QFtp::get ( const QString & file, QIODevice * dev = 0, TransferType type = Binary ). По данному примеру и сделай свою реализацию, пускай и консольную, GUI в примере чисто для визуализации.

3. Прочитай Поддержка потоков в Qt.

А теперь, если ты на отлично понял 1, 2, 3 пункты, попробуй 'нарисовать' более ясную картину твоей реализации. Потому как у тебя явно полная каша в голове. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_me_*
сообщение 18.2.2009, 0:17
Сообщение #3





Гости








    


Цитата(ViGOur @ 17.2.2009, 23:36) *
А теперь, если ты на отлично понял 1, 2, 3 пункты, попробуй 'нарисовать' более ясную картину твоей реализации. Потому как у тебя явно полная каша в голове. :)


Вы не поверите.. про потоки и слоты я читал.. и пример тоже смотрел. Причём после предложения прочитать ещё раз я честно перечитал это ещё раз дабы освежить в памяти.

В голове у меня действительно сейчас небольшая каша..((( причём гланым образом из-за того что я не понимаю как конкретно работает асинхронный QFtp. Ведь как я понял функции аля connect и get сразу же возвращают значение при этом не блокируют поток... Вообще самое печальное что я не так давно делал и клиентское приложение и серверное приложение где было по потоку на соединение.. но там вроде всё получилось но видать не доразобрался до конца.

Попробую объяснить что я хотел бы сделать:

Главный поток парсит файл. На каждое задание он создаёт поток и передаёт конструктору потока адрес сервера, логин пароль, путь к папке на сервере, путь к локальной папке.
В потоке происходит подключение к ftp серверу. Считывается листинг директории (с вхождением в глубь) и проверяется по маске нужные нам файлы. После этого файлы скачиваются.

Неясный мне момент вот в чём:

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

1) list будет испускать сигнал о каждой записи. Предположим что мы сделали коннект этого сигнала со слотом класса MyThread который их как-то обрабатывает. Скажите сигнал listInfo будет обрабатываться после exec или до??? или exec вообще здесь никак не влияет? Если бы речь шла о функциях которые отрабатывают сразу всё было бы ясно.. но здесь ведь асинхронная работа.. Или exec нам в данном случае вообще не нужен?

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

3) добавлю к вопросу 1. Когда мы будем извещаться о том отработала например функция connectToHost (cоотвествующий сигнал что функция done)? в произвольный момент времени после её вызова или строго после exec?

з.ы. exec как много в этом звуке=((((
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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


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


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




RSS Текстовая версия Сейчас: 18.2.2025, 14:35