![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Invalid pointer operation
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 не нажимать, то спустя некоторое время приложение вообще подвисает!