Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Invalid pointer operation


Страницы:   1 2

Garacio ©   (2007-01-22 22:43:00) 

Прочитав статью про файловые операции средствами, я решил использовать описанный там код для копирования файлов:
procedure TForm4.ButtonCopyClick(Sender: TObject);
var Dir1, Dir2: string;
begin
DirCopy := ExcludeTrailingPathDelimiter(DirCopy);
if RadioGroup1.ItemIndex = -1 then
 begin
    Exit;
 end;
Form4.Hide;
if RadioGroup1.ItemIndex = 0 then
 begin
  if  Copy(Dir1, Length(Dir1) - 2, 3) = 'LOG'
   then begin
    CopyFiles( Handle, [ Dir1 ], DirCopy, False, False ); //ошибка!!!
   end
   else begin
    ShowMessage('Выберите папку LOG!');
    Form4.Show;
    Exit;
   end;
 end;
if RadioGroup1.ItemIndex = 1 then
 begin
  Dir2 := DirCopy +'\Tools';
  CopyFiles( Handle, [ Dir1 ], Dir2, False, False );
 end;
if RadioGroup1.ItemIndex = 2 then
 begin
  Dir2 := DirCopy +'\Tools';
  CopyFiles( Handle, [ Dir3 ], Dir2, False, False );
 end;
Form4.Show;
end;

RadioGroup1 я использую для выбора каталога-назначения. При ItemIndex = -1, 1, 2 всё работает как часы, но при ItemIndex = 0 появляется ошибка "Invalid pointer operation."
Помогите разобраться!


TRUNK   (2007-01-24 10:29:00) [1]


> Garacio ©   (23.01.07 13:10) [24]
> Кажется я понял! Такая ерунда происходит, когда я копирую
> маленькие файлы

Я кажется знаю, в чём причина подвисания программы. Судя по всему
используемая функция копирования создаёт дополнительный поток
для копирования и тут же возвращает управление, не дожидаясь
завершения копирования, после этого происходит то же самое со
следующим файлом и так далее. В результате быстро возрастает
количество потоков в программе из-за чего она и виснет.
Справедливость моих рассуждений можно проверить открыв в
Delphi окно Threads и посмотреть сколько потоков образуется
при копировании.


Elen   (2007-01-24 09:57:00) [2]


> Я так понимаю для Form4.Show после CopyFiles

А что там такого в Шоу этой формы прописано, что может так действовать?
Мой тебе совет - пройдись дебуггером.


Garacio   (2007-01-24 09:49:00) [3]

Я так понимаю для Form4.Show после CopyFiles


Elen   (2007-01-24 09:22:00) [4]


> Видимо, действительно, не хватало времени!

Для какой процедуры?


Garacio   (2007-01-24 08:53:00) [5]

После того, как я дописал после CopyFiles строку: Sleep(1000), зависания в панели прекратились. Видимо, действительно, не хватало времени! Но мне кажется sleep - не совсем удачный выход: для моего компьютера достаточно 1 секунды, а что будет на более быстром?
Можно заменить sleep на Application.ProcessMessages? или на что-то подобное, чтобы не гадать – сколько времени необходимо для конкретного компьютера?


Anatoly Podgoretsky   (2007-01-23 21:41:00) [6]

> clickmaker  (23.01.2007 13:28:28)  [28]

> какую защиту? от чего?

От автора конечно.


Игорь Шевченко   (2007-01-23 14:18:00) [7]

Garacio ©   (23.01.07 12:14) [18]


> Dir1 я убрал из var


То есть, у тебя не работает один код а ты сюда постишь другой ?

Удачи тебе. Ищи где светлее.


Elen   (2007-01-23 14:00:00) [8]


> что, кстати, в CreateBuffer?

см. [13]


clickmaker   (2007-01-23 13:53:00) [9]


> [30] Garacio ©   (23.01.07 13:36)

что, кстати, в CreateBuffer?


Elen   (2007-01-23 13:41:00) [10]


> Garacio

Здесь глюков быть не должно. Пройдись дебаггером по этому коду при копировании маленьких файлов и посмотри где будет застрявать на
CreateBuffer(Src,SrcBuf); или на  Result:=SHFileOperation(SHFileOpStruct);


Garacio   (2007-01-23 13:36:00) [11]

Уже влез, см.[24]


Elen   (2007-01-23 13:32:00) [12]


> Доказанно многочисленными экспериментами! ;-)

Код большой? Влезет в студию?


clickmaker   (2007-01-23 13:28:00) [13]


> [27] Garacio ©   (23.01.07 13:18)

какую защиту? от чего?


Garacio   (2007-01-23 13:18:00) [14]


> Странно. Что-то я сомневаюсь в правильности этих выводов...

Доказанно многочисленными экспериментами! ;-)
Как написать защиту для копирования "маленьких" файлов?


clickmaker   (2007-01-23 13:15:00) [15]


> программа "не успевает сообразить",

чего она не успевает сообразить?


Elen   (2007-01-23 13:13:00) [16]


> Такая ерунда происходит, когда я копирую маленькие файлы!
>  Как только я добавляю в копируемую папку большой файл..
> . всё копируется без "глюков"!

Странно. Что-то я сомневаюсь в правильности этих выводов...


Garacio   (2007-01-23 13:10:00) [17]

Кажется я понял! Такая ерунда происходит, когда я копирую маленькие файлы! Как только я добавляю в копируемую папку большой файл... всё копируется без "глюков"!
Как изменить код, чтобы такого не было? Sleep, чтоли поместить, но куда? Видимо программа "не успевает сообразить", когда копируемые объекты маленькие!
function CopyFiles(Handle:Hwnd;Src:array of
string;Dest:string;Move:Boolean;AutoRename:Boolean):Integer;
var
 SHFileOpStruct:TSHFileOpStruct;
 SrcBuf:PBuffer;
begin
 CreateBuffer(Src,SrcBuf);
 with SHFileOpStruct do
   begin
     Wnd:=Handle;
     wFunc:=FO_COPY;
     if Move then wFunc:=FO_MOVE;
     pFrom:=Pointer(SrcBuf);
     pTo:=PChar(Dest);
     fFlags:=0;
     if AutoRename then fFlags:=FOF_RENAMEONCOLLISION;
     fAnyOperationsAborted:=False;
     hNameMappings:=nil;
     lpszProgressTitle:=nil;
   end;
 Result:=SHFileOperation(SHFileOpStruct);
 FreeMem(SrcBuf);
end;


clickmaker   (2007-01-23 12:35:00) [18]


> [21] Garacio ©   (23.01.07 12:22)

обработчика OnShow нету случаем?
а вообще-то лучше отладчиком пройтись по этому месту


Elen   (2007-01-23 12:23:00) [19]


> Garacio

Что-то явно тормозит при креации. Весь код большой?


Garacio   (2007-01-23 12:22:00) [20]


> SetForegroundWindow(Form4.Handle)

Не помогло! Более того, я заметил, что если сразу Alt+F4 не нажимать, то спустя некоторое время приложение вообще подвисает!


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо