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

Delphi Sources



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

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

Может лучше поделить процедуру? Часть кода вынести в таймер или "нить"?
А здесь:
Код:
if not FileExists(FlacName+'t.flac') then Exit; 
    while not RenameFile(FlacName+'t.flac',FlacName+'.flac') do Application.ProcessMessages
так не лучше будет?
Код:
  if FileExists(FlacName+'t.flac') then
    while not RenameFile(FlacName+'t.flac',FlacName+'.flac') do Application.ProcessMessages
но лучше всё же разделить код.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

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

Пробывал так получается файла еще нету или он занят и все время процедура завершается функцией Exit;
Во втором примере почти тоже самое , в итоге нужного файла нету

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

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

А выход есть?


Пробую вот так
Цитата:
while not FileExists(FlacName+'t.flac') do Application.ProcessMessages;
Тоже вешает

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

Смотри в сторону CreateProcess.
Код:
function WinExecAndWait32(FileName:String; Visibility : integer):integer;
var
  zAppName    : array[0..512] of Char;
  zCurDir     : array[0..255] of Char;
  WorkDir     : String;
  StartupInfo : TStartupInfo;
  ProcessInfo : TProcessInformation;
begin
  StrPCopy(zAppName, FileName);
  GetDir(0, WorkDir);
  StrPCopy(zCurDir, WorkDir);
  FillChar(StartupInfo, SizeOf(StartupInfo), 0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := Visibility;
  if not CreateProcess(nil,
                       zAppName,                      { указатель на строку с командной строкой }
                       nil,                           { указатель на атрибуты безопасности процесса }
                       nil,                           { указатель на атрибуты безопасности потока }
                       False,                         { флаг дескриптора предка }
                       CREATE_NEW_CONSOLE or          { флаги создания }
                       NORMAL_PRIORITY_CLASS,
                       nil,                           { указатель на новый блок среды }
                       nil,                           { указатель на имя текущего каталога }
                       StartupInfo,                   { указатель на STARTUPINFO }
                       ProcessInfo) then
    Result := -1 { указатель на PROCESS_INF }
  else
  begin
    WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, Result);
  end;
end;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 09.02.2012 в 00:29.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Siropchik (09.02.2012)
  #21  
Старый 09.02.2012, 00:42
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

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

При компиляции вылетает вот такая ошибка , может нужно какой нибудь копмонент то в Uses прописать?
[Error] SoundRecog.pas(308): Types of actual and formal var parameters must be identical
Ошибка вылетает в строке
GetExitCodeProcess(ProcessInfo.hProcess, Result);
Вот что у меня в USes
Цитата:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, MMSystem, httpsend, ShellAPI, Wintypes, WinProcs;

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

Закоментировал строку
// GetExitCodeProcess(ProcessInfo.hProcess, Result);
И все заработало. Только о результате не будет известно
Спасибо за помощь

Последний раз редактировалось Siropchik, 09.02.2012 в 13:34.
Ответить с цитированием
  #24  
Старый 09.02.2012, 15:11
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

Оказалось функция GetExitCodeProcess возвращает тип DWORD , а не Int
Ответить с цитированием
  #25  
Старый 09.02.2012, 15:13
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

вообще-то:
Код:
BOOL GetExitCodeProcess(
    HANDLE hProcess,	// handle to the process 
    LPDWORD lpExitCode 	// address to receive termination status 
   );
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #26  
Старый 09.02.2012, 15:24
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

sizeof(BOOL) = sizeof(DWORD) = sizeof(Cardinal) = sizeof(Integer) = 4.
А вот LPDWORD (указатель на DWORD) стоило бы и выделить красным.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter