Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование в потоке 
V
    Опции темы
livo
Дата 9.12.2009, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Произвожу копирование в потоке с помощью функции CopyFileEx.
Она должна производить копирование файла и выводить информацию о прогрессе копирования: имя копируемого файла и процент.

Но вот имя файла она и не выводит. Хотя с процентами все в порядке.

Вот ее вызов:
Код

//...
CopyFileEx(src.c_str(),dst.c_str(),progressfun,0,0,0);
//...


Вот функция, которая вызывается каждый раз, когда очередная порция байт скопирована:
Код

DWORD CALLBACK progressfun(//это функция-друг класса потока
  LARGE_INTEGER TotalFileSize,
  LARGE_INTEGER TotalBytesTransferred,
  LARGE_INTEGER StreamSize,
  LARGE_INTEGER StreamBytesTransferred,
  DWORD dwStreamNumber,
  DWORD dwCallbackReason,
  HANDLE hSourceFile,
  HANDLE hDestinationFile,
  LPVOID lpData
 )
{
 static bool kb=0;
 if(dwCallbackReason==CALLBACK_STREAM_SWITCH)
 {
   kb=(TotalFileSize.QuadPart>=2147483647);
   thrCopy->cntPartsTransferred=0;
   thrCopy->cntPartsAll=kb?TotalFileSize.QuadPart/1024:TotalFileSize.QuadPart;
   thrCopy->Synchronize(thrCopy->syncSetProgressObject);//а вот здесь проблема
 }
 else
 {
   thrCopy->cntPartsTransferred=kb?TotalBytesTransferred.QuadPart/1024:TotalBytesTransferred.QuadPart;
   thrCopy->Synchronize(thrCopy->syncSetProgressObject);//... и здесь соответственно. См. ниже
 }
 return thrCopy->Terminated?PROGRESS_CANCEL:PROGRESS_CONTINUE;
}



Код

void __fastcall TReserveCopyThread::syncSetProgressObject()
{
 FReserveCopy->progressObject->Max=cntPartsAll;
 FReserveCopy->progressObject->Position=cntPartsTransferred;
 FReserveCopy->labObjectName->Caption=ExtractFileName(*pstr_src);/*Это указатель на строку, которая содержит полное имя файла. 
Указатель правильный, т. к. его устанавливаю перед вызовом ф-ии CopyFileEx.
*/
}

PM MAIL   Вверх
586
Дата 9.12.2009, 03:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(livo @  9.12.2009,  02:52 Найти цитируемый пост)
Указатель правильный, т. к. его устанавливаю перед вызовом ф-ии CopyFileEx.

Указатель может и правильный - но объект, на который указывает этот указатель может быть уже уничтожен.
Как устанавливается этот указатель перед вызовом CopyFileEx - тоже непонятно.

Это сообщение отредактировал(а) 586 - 9.12.2009, 03:38
PM   Вверх
mrbrooks
Дата 9.12.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



livo, а чем Вас не устраивает копирование FileSteam'ами. Очень кошерная вещь.
PM MAIL   Вверх
artsb
Дата 9.12.2009, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



livo, а какой тип у pstr_src? Если char*, то тогда надо так:
Код

FReserveCopy->labObjectName->Caption=ExtractFileName(AnsiString(pstr_src));



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
livo
Дата 9.12.2009, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



586, объект не удаляется. Удаление происходит в конце процедуры выполнения потока.
mrbrooks, TFileStream медленнее, чем CopyFileEx.
artsb, вот объявление: String *pstr_src.

Указание объекта:
Код

pstr_src=&(pii->from);//pii - указатель на структуру типа ItemInfo


Вот структура:
Код

struct ItemInfo
{
   ItemInfo(){type=0; pvps=0;}
   int type;
   String from,to;
   bldf::VC_PSTR *pvps;
};

Все объекты этой структуры создаются перед выполнением собственно копирования и заносятся в векторный список. Вот его спецификация:
Код

typedef std::vector<ItemInfo*> VC_PII;
VC_PII *pvpii;

И только после проведения операций копирования все элементы списка удаляются.

По моему, данные строки просто не успевают прочитаться.
Звучит странно, но вот пример: копировал файл с именем "D:\Hawx.md2". Вот название этого файла - "Hawx.md2" - и отобразилось.
Или может я не вижу чего-то очевидного?
PM MAIL   Вверх
artsb
Дата 9.12.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



livo, попробуйте использовать не указатель на строку, а саму строку:
Код

String pstr_src;
//...
pstr_src= pii->from;


Добавлено через 14 минут и 40 секунд
Хотя, сейчас сделал тестовый проект. С указателем всё отлично отрабатывает.
Значит, дело в чём-то другом.
Где вы производите присваивание:
Код

pstr_src=&(pii->from);



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
livo
Дата 9.12.2009, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ребята, все работает. Указатель был нужный, но только для файла. А при копировании каталога указателю нужного объекта я не давал.

Вот фрагмент кода, который занимается копированием:
Код

for(ivii=pvpii->begin(); ivii<pvpii->end() && !Terminated; ivii++)
 {
   ItemInfo *pii=*ivii;
   const String new_fpath=IncludeTrailingPathDelimiter(pii->to);
   String new_fname;
   switch(pii->type)
   {
     case itFILE://если в списке файл
     {
       new_fname=new_fpath+ExtractFileName(pii->from);
       pstr_src=&(pii->from);
       copied=copyfx(pii->from,new_fname);
       cntFilesViewed++;
       Synchronize(syncUpdateResults);
       Synchronize(syncSetProgressAll);
     }
     break;
     case itDIR://если скопировать нужно каталог
     {
       int start=ExtractFileDir(pii->from).Length()+2;
       for(ivs=pii->pvps->begin(); ivs<pii->pvps->end() && !Terminated; ivs++)
       {
         new_fname=new_fpath+(**ivs).SubString(start,(**ivs).Length());
         pstr_src=*ivs;//НУЖНО ЗДЕСЬ БЫЛО
         if(ForceDirectories(ExtractFileDir(new_fname)))
           copied=copyfx(**ivs,new_fname);
         else copied=0;
         cntFilesViewed++;
         //pstr_src=*ivs;   ---   вот здесь я назначал ---- ОШИБКА
         Synchronize(syncUpdateResults);
         Synchronize(syncSetProgressAll);
       }
     }
     break;
   }
 }

PM MAIL   Вверх
artsb
Дата 10.12.2009, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Так и знал...  smile 


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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