Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 85 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2013, 14:12   #1
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию Дождаться завершения работы командной строки

Можно ли так сделать, вот смотрите есть код в нем вызывается командная строка, в ней создаются поочередно 6 файлов .PNM далее надо, как-то дождаться создания последнего PNM файла, чтобы по очереди их все распознать, я вставил функцию If Fileexist() then это не помогло, программа не дожидается создания файла, в результате, все текстовики создаются пустыми, только после второго нажатия на кнопку они заполняются. Попробовал вставить функцию sleep(100) после нее примерно 50% текстовых файлов заполняются, но это очень не желательная для меня функция, нужно чтобы времени по-минимуму затрачивалось

Код:
var
i,z: integer;
a,b: ansistring;
s: string;
F: textfile;
players: array[1..6] of integer;

Label met, met1;//метка

begin
  z:=1;
  i:=1;

  WinExec(PAnsiChar('cmd /c cd C:\GOCR\'), SW_HIDE); //переходим в директорию C:\GOCR

  // Переводим все в PNM
  while i <> 7 do begin
    b:='cmd /c png2pnm C:\GOCR\bot\'+ IntToStr(i) +'.png C:\GOCR\'+IntToStr(i)+'.pnm';
    WinExec(PAnsiChar(b), SW_HIDE);
   i:=i+1;
  end;
  //

  //Ждем создание последнего файла и распознаем
  met:
    if  fileexists ('C:\GOCR\6.png') = false then goto met
  else begin

    sleep(100);

    while z<>7 do begin
      a:='cmd /c gocr -i C:\GOCR\bot\'+IntToStr(z)+'.PNM -c >C:\GOCR\'+IntToStr(z)+'.txt';
      WinExec(PAnsiChar(a), SW_HIDE);
      z:=z+1;
    end;
  end;
  //

  met1:
    if  fileexists ('C:\GOCR\bot\6.txt') = false then goto met1
  else
  //
  for i := 1 to 6 do begin

   memo1.Lines.LoadFromFile('C:\GOCR\bot\'+IntToStr(i)+'.txt');
   s := Memo1.Lines.Strings[0];
   players[i] := RedStek(s);
   RichEdit1.Lines.Strings[i] := IntToStr(players[i]);
   memo1.Clear;

  end;     
  //

  for i := 1 to 6 do begin
    //DeleteFile ('C:\GOCR\'+IntToStr(i)+'.png');
    DeleteFile ('C:\GOCR\'+IntToStr(i)+'.pnm');
    DeleteFile ('C:\GOCR\'+IntToStr(i)+'.txt');
  end;

end;
ivt22 вне форума Ответить с цитированием
Старый 31.10.2013, 14:14   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,751
По умолчанию

Много раз обсуждалось. Гуглом лень пользоваться? Вот например Запуск внешнего приложения и ожидание его завершения
FaTaL вне форума Ответить с цитированием
Старый 31.10.2013, 14:22   #3
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию

там вот такой код но он не компилируется ему не нравится cb := SizeOf(SUInfo); а именно SUInfo он не может найти:

Код:
function ExecAndWait(const FileName,
                     Params: ShortString;
                     const WinState: Word): boolean; export; 
var 
  StartInfo: TStartupInfo; 
  ProcInfo: TProcessInformation; 
  CmdLine: ShortString; 
begin 
  { Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x } 
  CmdLine := '"' + Filename + '" ' + Params; 
  FillChar(StartInfo, SizeOf(StartInfo), #0); 
  with StartInfo do 
  begin 
    cb := SizeOf(SUInfo); 
    dwFlags := STARTF_USESHOWWINDOW; 
    wShowWindow := WinState; 
  end; 
  Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false, 
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, 
                          PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo); 
  { Ожидаем завершения приложения } 
  if Result then 
  begin 
    WaitForSingleObject(ProcInfo.hProcess, INFINITE); 
    { Free the Handles } 
    CloseHandle(ProcInfo.hProcess); 
    CloseHandle(ProcInfo.hThread); 
  end; 
end;

Последний раз редактировалось ivt22; 31.10.2013 в 14:34.
ivt22 вне форума Ответить с цитированием
Старый 31.10.2013, 14:47   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Там должно быть по идее
Код:
cb := SizeOf(TStartupInfo);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.10.2013, 14:56   #5
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию

Понял, спасибо. но все равно не рабочая функция. даже ExecAndWait( 'C:\windows\calc.exe', '', SW_SHOWNORMAL) даже здесь никакого калькулятора не запускается, а мне нужно cmd /c -gocr -i... и т.д. пойду искать другой способ
ivt22 вне форума Ответить с цитированием
Старый 31.10.2013, 15:21   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
даже здесь никакого калькулятора не запускается
Так нужно проверять что возвращает CreateProcess.
Опиши проверку и вывод на экран ошибки используя RaiseLastOSError() в else твоего IF, что проверяет результат и почитай ошибку.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.10.2013, 15:35   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Все работает, только немного мозги нужно подключать
Код:
ExecAndWait('C:\windows\system32\calc.exe','',SW_SHOWNORMAL);
И функцию чуть изменить, как Виталий подсказывает, для возврата кода ошибки в случае неудачи
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 31.10.2013 в 15:39.
Аватар вне форума Ответить с цитированием
Старый 31.10.2013, 16:20   #8
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Все работает, только немного мозги нужно подключать
Код:
ExecAndWait('C:\windows\system32\calc.exe','',SW_SHOWNORMAL);
И функцию чуть изменить, как Виталий подсказывает, для возврата кода ошибки в случае неудачи
ок понял еще раз спасибо, а как быть вот с такой строчкой?
'cmd /c png2pnm C:\GOCR\1.png C:\GOCR\1.pnm' для командной строки?
ivt22 вне форума Ответить с цитированием
Старый 31.10.2013, 16:43   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

у вас в папке C:\GOCR\ лежит файл с именем png2pnm.
Какое расширение у этого файла? (что это - командный файл, exe-шник или что-то другое?)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.10.2013, 16:47   #10
ivt22
Пользователь
 
Регистрация: 23.07.2013
Сообщений: 81
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
у вас в папке C:\GOCR\ лежит файл с именем png2pnm.
Какое расширение у этого файла? (что это - командный файл, exe-шник или что-то другое?)
вообще там написано png2pnm.exe Но я его всегда этой командой запускаю,
по другому просто нельзя, нужно ему параметры передавать. Я вот так делаю
Код:
    b:='cmd /c png2pnm C:\GOCR\bot\1.png C:\GOCR\1.pnm';
    WinExec(PAnsiChar(b), SW_HIDE);
дальше мне необходимо отловить событие, когда файл 1.pnm полностью создастся, для этого и нужно ожидание
ivt22 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме 85 тыс рублей в месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дождаться завершения другой программы в консоле delphi SawaMEN Общие вопросы Delphi 4 09.09.2013 14:26
ожидание завершения работы макроса -Anton- Microsoft Office Excel 15 18.06.2011 18:17
Как дождаться завершения запущенного приложения DennerV Win Api 5 13.08.2010 13:48
Как дождаться завершения процедуры? Hintman Win Api 6 14.10.2009 14:46
Перехват завершения работы ОС vynt Win Api 7 19.05.2008 08:59