Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.02.2012, 22:27
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию Как правильно проверить освободился фаил или нет?

В этой процедуре программа зацикливается, реагирует на все кроме кнопки завершения . Есть подозрение что в цикле while not RenameFile(FlacName+'.wav',FlacName+'t.wav') do Application.ProcessMessages;
возможно по какой то причине фаил не создан
Подскажите пожалуйста как лучше решить и обойти эту проблему?
программа может проработать 1минуту , а может и 10 мин.

PHP код:
procedure SaveFlac(FlacName:string);
var
fw:file of byte;
i:integer;
hfhwnd;
begin
    iniWav
;  //инициализировать структуру Wave
    
assignFile(fw,FlacName+'.wav'); 
    
rewrite(fw);   
    
blockWrite(fw,waveHdr,sizeOf(waveHdr)); //записать заголовок  wave
    
blockWrite(fw,proc_buf[0],qz); 
    
closeFile(fw);        
    while 
not RenameFile(FlacName+'.wav',FlacName+'t.wav') do Application.ProcessMessages;  

    
ShellExecute(hf'open''flac.exe'PChar(' -F '+FlacName+'t.wav'), nilSW_HIDE);
    while 
not RenameFile(FlacName+'t.flac',FlacName+'.flac') do Application.ProcessMessages;  

    
DeleteFile(FlacName+'t.wav');
 
end;
End

Последний раз редактировалось Siropchik, 08.02.2012 в 22:34.
Ответить с цитированием
  #2  
Старый 08.02.2012, 22:30
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Скорее всего в while. Например, если файл не найден. Или если он открыт другим процессом. Хотя в код особо не вчитывался.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 08.02.2012, 22:42
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

Я перед циклом фаил создаю и записываю в него данные
А сам цикл нужен для того что бы подождать когда фаил освободится от других процессов, что бы потом можно было запустить преобразования файла в другой формат
Ответить с цитированием
  #4  
Старый 08.02.2012, 22:47
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Посмотри использование ключа {$I+/-}
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 08.02.2012, 22:54
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

Честно говоря я не знаю что это за зверь, я не профессионал
я так понял это деректива , но где ее прописывать?
Цитата:
{$I+/-} - проверка результата ввода-вывода Если используется ключ {$1+}, при возникновении ошибки ввода-вывода программа прекращает работу. В случае ключа {$1-} при возникновении ошибки ввода-вывода программа не выбрасывается, а код ошибки можно получить с помощью функции IOResult. Ключ является локальным. По умолчанию используется ключ {$1+}. Эквивалент меню - Options|Compiler| I/O checking.

Последний раз редактировалось Siropchik, 08.02.2012 в 22:56.
Ответить с цитированием
  #6  
Старый 08.02.2012, 22:58
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Код:
{$I-}  
  assignFile(fw,FlacName+'.wav');  
  rewrite(fw);    
  if IOResult = 0 then
  begin
    blockWrite(fw,waveHdr,sizeOf(waveHdr)); //записать заголовок  wave 
    blockWrite(fw,proc_buf[0],qz);  
    closeFile(fw);
  end;
{$I+}  
А перед while, используй FileExists.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 08.02.2012 в 23:04.
Ответить с цитированием
  #7  
Старый 08.02.2012, 23:04
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

Сделал как написано , теперь подвисает сразу
Ответить с цитированием
  #8  
Старый 08.02.2012, 23:06
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

Цитата:
А перед while, используй FileExists.
Сейчас попробую
Вот так пойдет
if not FileExists(FlacName+'.wav') then Exit;

Последний раз редактировалось Siropchik, 08.02.2012 в 23:09.
Ответить с цитированием
  #9  
Старый 08.02.2012, 23:07
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вот и ищи где загвоздка.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #10  
Старый 08.02.2012, 23:16
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

Странно но все равно виснет
еще сделал проверку файла после ShellExecute
но все так же и виснет
Ответить с цитированием
  #11  
Старый 08.02.2012, 23:17
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

"Прошагать" пробовал?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #12  
Старый 08.02.2012, 23:22
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

Щас попробую
Ответить с цитированием
  #13  
Старый 08.02.2012, 23:39
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

Выяснил что зависалово начинается в цикле после ShellExecute
хотя фаил создается на диск но не переименовывается
Прошагать не получается, даже на Break не реагирует
PHP код:
ShellExecute(hf'open''flac.exe'PChar(' -F '+FlacName+'t.wav'), nilSW_HIDE); 
   if 
not FileExists(FlacName+'t.flac'then Exit;
    while 
not RenameFile(FlacName+'t.flac',FlacName+'.flac') do Application.ProcessMessages
Ответить с цитированием
  #14  
Старый 08.02.2012, 23:42
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

получается здесь меня выкидывает из процедуры и по этому фаил не переименовывается
Цитата:
if not FileExists(FlacName+'t.flac') then Exit;
Закоментировал эту строчку, пока работает
Ответить с цитированием
  #15  
Старый 08.02.2012, 23:48
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

Проработал 5 мин. и завис
Незнаю что туда кроме Sleep можно приткнуть
Сделал так:
Цитата:
ShellExecute(hf, 'open', 'flac.exe', PChar(' -F '+FlacName+'t.wav'), nil, SW_HIDE);
sleep(2000);
все работает и не виснет, но это колхоз
Посоветуйте решение

Последний раз редактировалось Siropchik, 08.02.2012 в 23:57.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:38.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter