![]() |
|
|
![]()
|
|
| mosg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 3.3.2008 Где: Moscow Репутация: 1 Всего: 1 |
Добрый день.
Проблема: необходимо скопировать большое кол-во файлов через QFile::copy(fromFileName, toFileName) и после этого сразу сжать все эти файлы в архив (все делается в одном коде). Эти действия выполняются последовательно, и по идее должно все работать, но на деле получается, что файлы копируются с запозданием и в архив часть файлов не поподает. Если поставить между действиями копировать и архивировать вывод какого-нить QMessabeBox'а, то все файлы "успевают" скопироваться, а следовательно, попасть в архив. Может быть кто встречался с такой проблемой, а то не хочется тайменги выставлять или контролировать копирование файлов? Спасибо. |
|||
|
||||
| ecspertiza |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: 4 Всего: 5 |
Контроль полюбому необходим, а то это как то неправильно получается мы не знаем есть файл или нет и пытаемся его архивировать.
|
|||
|
||||
| mosg |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 3.3.2008 Где: Moscow Репутация: 1 Всего: 1 |
У меня задача в 100%-ности копирования файлов не стоит, поэтому я и надеюсь отделаться малой кровью. На мой взгляд, тут дело в том, что процессы копирования происходят путем создания дополнительных потоков для ускорения работы: т.е. у меня к примеру копируется 10 файлов путем:
Пути абсолютные. Путем Qt создаются 10 потоков, они начинают свое выполнение, часть файлов копируется, а вот часть не успевает, так как сразу подключается ф-ция архивирования acrhive(). В итоге получается неполный или, вообще, пустой архив. На мой взгляд, должно быть средство, которое отключает данную "фитчу"... |
||||
|
|||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
т.е. вы думаете что функция копирования асинхронная?
или копирование и архивирование у вас в разных потоках? -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| mosg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 3.3.2008 Где: Moscow Репутация: 1 Всего: 1 |
Сперва я банально переношу файлы путем QFile::copy() и далее ниже по тексту вызываю поток сборки архива в папочке, где все файлы и лежат. Объясню почему сделал поток (QThead простейший): надо было при архивировании показывать хотя бы как-то, что программа работает и не повисла, поэтому вкрутил симпотичный анимированный GIF (дешево, сердито и красиво Я дополнительно ещё проверил: файлы полностью переносятся в нужную папку перед архивацией, да вот только то ли что-то блокирует их, то ли ещё что-то, но файлы упорно не хотят "лезть" в архив. Причем: у меня программа работает в 2-х режимах - GUI и консольный(программа запускается с параметром, и без участия юзера делает тот же архив). Т.е. В GUI пользователь нажимает на кнопочку и все получается, а вот в консольном режиме теже действия не проходят... зы: понимаю что вопросы задаю мыльные, но код постить не буду, потому как его много, а толку будет думаю мало от этого, ключевые моменты описал |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
Есть такой вариант. Ради эксперимента.
Если функция "copy()" вернула истину, в потоке, в цикле проверяй условие "QFile::exists()", пока не вернет истину, потом уже добавляй в архив. Возможно скорость немного снизится. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| mosg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 3.3.2008 Где: Moscow Репутация: 1 Всего: 1 |
Спасибо за предложения, но все таки собака была зарыта в другом месте: так как приложение в консольном режиме (т.е. запуск и завершение отрабатываются самой программой), то после того, как она копировала файлы в папку и начинала в отдельном потоке делать архив, программа успевала закрыться, а при закрытии у меня стоит ф-ция чистки всех временных файлов - что и приводило к созданию пустых архивов.
Решение: программу закрывать только после завершения выполнения потока! |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
Так это же очевидно. Для этого потоки и существуют.
Как реализовал? -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| mosg |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 3.3.2008 Где: Moscow Репутация: 1 Всего: 1 |
Ну да. Тормознул. Бывает такое, редко.
В основном диалоге, при отработке события завершения работы потока finished() вызывается ф-ция:
|
||||
|
|||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |