Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt4] QFile::copy, Вопрос по работе функции 
V
    Опции темы
mosg
Дата 19.8.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.3.2008
Где: Moscow

Репутация: 1
Всего: 1



Добрый день.

Проблема: необходимо скопировать большое кол-во файлов через QFile::copy(fromFileName, toFileName) и после этого сразу сжать все эти файлы в архив (все делается в одном коде). Эти действия выполняются последовательно, и по идее должно все работать, но на деле получается, что файлы копируются с запозданием и в архив часть файлов не поподает. Если поставить между действиями копировать и архивировать вывод какого-нить QMessabeBox'а, то все файлы "успевают" скопироваться, а следовательно, попасть в архив.

Может быть кто встречался с такой проблемой, а то не хочется тайменги выставлять или контролировать копирование файлов?

Спасибо.
PM MAIL WWW ICQ Skype GTalk Jabber YIM MSN   Вверх
ecspertiza
Дата 19.8.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



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




--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
mosg
Дата 19.8.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.3.2008
Где: Moscow

Репутация: 1
Всего: 1



Цитата(ecspertiza @ 19.8.2009,  13:54)
Контроль полюбому необходим, а то это как то неправильно получается мы не знаем есть файл или нет и пытаемся его архивировать.

У меня задача в 100%-ности копирования файлов не стоит, поэтому я и надеюсь отделаться малой кровью. smile Т.е. если из 1000 файлов 2-3х не будет, то это ещё ничего страшного, а вот когда я копирую 1-3 файла, и потом хочу их заархивировать, вот тогда пустой архив "выглядит" не очень радостно.

На мой взгляд, тут дело в том, что процессы копирования происходят путем создания дополнительных потоков для ускорения работы: т.е. у меня к примеру копируется 10 файлов путем:

Код
for (int i = 0; i < files.count(); i++) {
    if (!QFile::copy(fromList.at(i), toList.at(i))) {
        // ошибка
    }
}

acrhive();


Пути абсолютные. Путем Qt создаются 10 потоков, они начинают свое выполнение, часть файлов копируется, а вот часть не успевает, так как сразу подключается ф-ция архивирования acrhive(). В итоге получается неполный или, вообще, пустой архив.

На мой взгляд, должно быть средство, которое отключает данную "фитчу"... 
PM MAIL WWW ICQ Skype GTalk Jabber YIM MSN   Вверх
andrew_121
Дата 19.8.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



т.е. вы думаете что функция копирования асинхронная?
или копирование и архивирование у вас в разных потоках?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mosg
Дата 19.8.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.3.2008
Где: Moscow

Репутация: 1
Всего: 1



Цитата(andrew_121 @ 19.8.2009,  15:34)
т.е. вы думаете что функция копирования асинхронная?
или копирование и архивирование у вас в разных потоках?

Сперва я банально переношу файлы путем QFile::copy() и далее ниже по тексту вызываю поток сборки архива в папочке, где все файлы и лежат.

Объясню почему сделал поток (QThead простейший): надо было при архивировании показывать хотя бы как-то, что программа работает и не повисла, поэтому вкрутил симпотичный анимированный GIF (дешево, сердито и красиво smile ) + отдельно работала скрутка файлов в архив, а так, если не пользоваться потоками, то GUI часть подвисала, что и не давало показывать анимацию загрузки... 

Я дополнительно ещё проверил: файлы полностью переносятся в нужную папку перед архивацией, да вот только то ли что-то блокирует их, то ли ещё что-то, но файлы упорно не хотят "лезть" в архив. 

Причем: у меня программа работает в 2-х режимах - GUI и консольный(программа запускается с параметром, и без участия юзера делает тот же архив). Т.е. В GUI пользователь нажимает на кнопочку и все получается, а вот в консольном режиме теже действия не проходят...


зы: понимаю что вопросы задаю мыльные, но код постить не буду, потому как его много, а толку будет думаю мало от этого, ключевые моменты описал smile
PM MAIL WWW ICQ Skype GTalk Jabber YIM MSN   Вверх
andrew_121
Дата 19.8.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Есть такой вариант. Ради эксперимента.

Если функция "copy()" вернула истину, в потоке, в цикле проверяй условие "QFile::exists()", пока не вернет истину, потом уже добавляй в архив. Возможно скорость немного снизится.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mosg
Дата 20.8.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.3.2008
Где: Moscow

Репутация: 1
Всего: 1



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

Решение: программу закрывать только после завершения выполнения потока!  smile 
PM MAIL WWW ICQ Skype GTalk Jabber YIM MSN   Вверх
andrew_121
Дата 20.8.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Цитата(mosg @  20.8.2009,  11:56 Найти цитируемый пост)
так как приложение в консольном режиме (т.е. запуск и завершение отрабатываются самой программой), то после того, как она копировала файлы в папку и начинала в отдельном потоке делать архив, программа успевала закрыться, а при закрытии у меня стоит ф-ция чистки всех временных файлов - что и приводило к созданию пустых архивов. 

Так это же очевидно. Для этого потоки и существуют.

Цитата(mosg @  20.8.2009,  11:56 Найти цитируемый пост)
Решение: программу закрывать только после завершения выполнения потока!

Как реализовал?




--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mosg
Дата 21.8.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.3.2008
Где: Moscow

Репутация: 1
Всего: 1



Цитата(andrew_121 @  20.8.2009,  19:08 Найти цитируемый пост)
Так это же очевидно.
Ну да. Тормознул. Бывает такое, редко.  smile 

Цитата(andrew_121 @  20.8.2009,  19:08 Найти цитируемый пост)
Как реализовал?
В основном диалоге, при отработке события завершения работы потока finished() вызывается ф-ция:

Код
connect(thread, SIGNAL(finished()), this, SLOT(on_thread_finished()));


Код
void    CMainDialog::on_thread_finished() {
    // ...
    if (conf->isConsole)
        this->close();
}


PM MAIL WWW ICQ Skype GTalk Jabber YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.