Форум Всеукраїнської інтернет-олімпіади NetOI


На форумі обговорюються лише питання, пов'язані з олімпіадою

Ви не зайшли.

#1 2005-10-29 11:40:28

ROBOT
Олімпієць
Звідки: Ялта
Зареєстрований: 2005-10-26
Повідомлень: 158

Умные люди

Я пишу программу А на Delphi
она должна:

1) запустить прогр. В
2) потом проверить не завершилась ли прогр. В
3) если нет то завершить её
4) если в В - ошибка, то снять её с выполнения, но не допустить появления
    окошка ("Отправить сообщение Microsoft" и "Не отправлять")

Программа В может быть под DOS и Windows
помогите написать эти фрагменты кода на Delphi
Если не знаете, то подскажите, где форумят умные люди по Delphi

И ещё: можно ли на олимпиаде писать программы на delphi или free pascal?

Відредаговано ROBOT (2005-10-29 11:43:26)


I have Delphi 7, BP 7.0, FP 1.0.4, Windows XP
Мои решения олимпиад на  Паскале: http://h0h0l.narod.ru/
Моя проверялка: http://www.proveryalka.narod.ru/
ICQ: 266367671

Поза форумом

 

#2 2005-10-29 21:13:52

Sharp
Олімпієць
Зареєстрований: 2005-10-17
Повідомлень: 34

Re: Умные люди

CreateProcess (даже лучше CreateProcessWithLogonW из соображений безопасности) с параметром dwCreationFlags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS, OpenProcess для проверки запущенности по полученному хандлу. Ошибки обрабатывать через WaitForDebugEvent.

Поза форумом

 

#3 2005-10-31 09:07:47

ROBOT
Олімпієць
Звідки: Ялта
Зареєстрований: 2005-10-26
Повідомлень: 158

Re: Умные люди

Так я ничего не пойму. Мне надо куски текста программы, а то на Delphi я не сильно шарю. Я даже не знаю, что такое хэндл.

Відредаговано ROBOT (2005-10-31 09:10:13)


I have Delphi 7, BP 7.0, FP 1.0.4, Windows XP
Мои решения олимпиад на  Паскале: http://h0h0l.narod.ru/
Моя проверялка: http://www.proveryalka.narod.ru/
ICQ: 266367671

Поза форумом

 

#4 2005-10-31 12:58:18

Sharp
Олімпієць
Зареєстрований: 2005-10-17
Повідомлень: 34

Re: Умные люди

Тогда следует использовать учебник по Делфи и MSDN. У меня не только нет такого кода на Делфи, я еще и ненавижу его.

Поза форумом

 

#5 2005-10-31 19:48:17

Fokysnik
Олімпієць
Звідки: Львів
Зареєстрований: 2005-10-05
Повідомлень: 51

Re: Умные люди

http://www.bib.com.ua/
Рульний сайт подивись, ROBOT!!!


all software must be free
ICQ: 233-537-226

Поза форумом

 

#6 2005-11-01 15:00:27

ROBOT
Олімпієць
Звідки: Ялта
Зареєстрований: 2005-10-26
Повідомлень: 158

Re: Умные люди

Fokysnik написав:

http://www.bib.com.ua/
Рульний сайт подивись, ROBOT!!!

посмотрел, написал сейчас жду от туда ответа

P.S. - как ты сделал ссылку?


I have Delphi 7, BP 7.0, FP 1.0.4, Windows XP
Мои решения олимпиад на  Паскале: http://h0h0l.narod.ru/
Моя проверялка: http://www.proveryalka.narod.ru/
ICQ: 266367671

Поза форумом

 

#7 2005-11-01 20:48:06

Fedor
Олімпієць
Звідки: Днепропетровск
Зареєстрований: 2005-10-31
Повідомлень: 8

Re: Умные люди

Кстати, еще один неплохой форум - forum.vingrad.ru
Для начинающих программистов с подобными проблемами - самое оно.

Відредаговано Fedor (2005-11-01 20:49:19)

Поза форумом

 

#8 2005-11-03 08:54:25

Fokysnik
Олімпієць
Звідки: Львів
Зареєстрований: 2005-10-05
Повідомлень: 51

Re: Умные люди

ROBOT написав:

Fokysnik написав:

http://www.bib.com.ua/
Рульний сайт подивись, ROBOT!!!

посмотрел, написал сейчас жду от туда ответа

P.S. - как ты сделал ссылку?

Просто пишеш як звичайний текст. Те шо починається на "http://" і тому подібне автоматично стає
ссилкою.
Короче просто пиши а ссилки самі появляться wink

Відредаговано Fokysnik (2005-11-03 08:57:02)


all software must be free
ICQ: 233-537-226

Поза форумом

 

#9 2005-11-13 08:02:51

Vitaly
Олімпієць
Звідки: Старгород
Зареєстрований: 2005-11-13
Повідомлень: 34

Re: Умные люди

Если ты на Delphi не сильно шаришь, сделать такое будет не просто.
- Если тебе надо засечь время выполнения проги, используй GetSystemTime или Now, потом WinExecAndWait32 (процедура описана на многих форумах, запускает прогу и ждет завершения)
Потом снова GetSystemTime и от последнего значения времени отнять первое.
- Если надо принудительно замочить процесс, используй Killtask по таймеру, найти также можно в FAQ'ах на многих форумах. НО: при запуске досовских прог надо мочить не саму прогу, а эмулятор, который в разных версиях форточек называется по-разному (см. в списке процессов)
что плохо - WinExecAndWait32 "вешает" прогу до завершения вызываемой. Поэтому надо выбирать.
- Узнать о завершении проги можно и косвенно. Например, запустить прогу с перенаправлением вывода в файл (aka "prog.exe > 1.txt").
При запуске программы создается 1.txt и он заблокирован до завершения проги. Как только ты можешь туда что-нибудь записать - прога завершилась. Проверять это можно путем многочисленных попыток сделать rewrite(f) или erase(f) внутри try..except..end или {$I-} ... if ioresult<>0 then goto_повтор {$I+}(чтоб не вылетало). Это универсальный способ для любых программ.
PS: А ты не систему проверки решений лепить собрался :-)


Кажется, админам не понравилась моя подпись. Так вот:
ROCK жил, жив и будет жить.
обо всем остальном тут выражаться не буду - не хватит места.

Поза форумом

 

#10 2005-11-13 17:50:15

Danteus
Олімпієць
Зареєстрований: 2005-10-05
Повідомлень: 24

Re: Умные люди

може лучше книжку по делфи купить?

Поза форумом

 

#11 2005-11-13 17:58:29

reiten
журі
Звідки: Киев
Зареєстрований: 2005-10-16
Повідомлень: 196

Re: Умные люди

1.Запуск:
preverrs=SetErrorMode(SEM_NOGPFAULTERRORBOX);
Затем делаешь CreateProcess с влагом CREATE_NEW_CONSOLE в параметрах создания.
А потом SetErrorMode(preverrs);
И сообщения об ошибках не появятся.
2.Ждешь завершения с помощью WaitForSingleObject.
3.Точное время работы получаешь с помощью GetProcessTimes.
4.Если надо забить программу, то для этого служит TerminateProcess.
5.Проверяешь код возврата с помошью GetExitCodeProcess. Если он не ноль, то была ошибка.
Детальнее что куда передавать смотри в МСДН.


"...Существуют два подхода к проектированию программ. В одном архитектура делается настолько простой, что в ней явно нет дефектов; в другом - настолько сложной, что в ней нет явных дефектов".
С. А. Хоар

Поза форумом

 

#12 2005-11-14 14:32:56

ROBOT
Олімпієць
Звідки: Ялта
Зареєстрований: 2005-10-26
Повідомлень: 158

Re: Умные люди

reiten написав:

1.Запуск:
preverrs=SetErrorMode(SEM_NOGPFAULTERRORBOX);
Затем делаешь CreateProcess с влагом CREATE_NEW_CONSOLE в параметрах создания.
А потом SetErrorMode(preverrs);
И сообщения об ошибках не появятся.
2.Ждешь завершения с помощью WaitForSingleObject.
3.Точное время работы получаешь с помощью GetProcessTimes.
4.Если надо забить программу, то для этого служит TerminateProcess.
5.Проверяешь код возврата с помошью GetExitCodeProcess. Если он не ноль, то была ошибка.
Детальнее что куда передавать смотри в МСДН.

что такое МСДН, на которую все ссылаются?


I have Delphi 7, BP 7.0, FP 1.0.4, Windows XP
Мои решения олимпиад на  Паскале: http://h0h0l.narod.ru/
Моя проверялка: http://www.proveryalka.narod.ru/
ICQ: 266367671

Поза форумом

 

#13 2005-11-14 14:35:58

ROBOT
Олімпієць
Звідки: Ялта
Зареєстрований: 2005-10-26
Повідомлень: 158

Re: Умные люди

Vitaly написав:

А ты не систему проверки решений лепить собрался :-)

вообще-тогь да...


I have Delphi 7, BP 7.0, FP 1.0.4, Windows XP
Мои решения олимпиад на  Паскале: http://h0h0l.narod.ru/
Моя проверялка: http://www.proveryalka.narod.ru/
ICQ: 266367671

Поза форумом

 

#14 2005-11-14 18:54:58

Джулгаков Дмитрий
Олімпієць
Звідки: Харьков
Зареєстрований: 2005-11-03
Повідомлень: 61

Re: Умные люди

MSDN - база знаний для разработчиков под Microsoft продукты, т.е. Windows. Содержит хелпы по WinAPI, .NET, Visual Studio, Visual Basic, SQL Server и прочим творениям Майкрософта. Есть он-лайн версия http://msdn.microsoft.com, кроме того с Visual Studio ставится вся msdn по WinAPI, .NET и С++.

Поза форумом

 

#15 2005-11-14 18:59:23

Джулгаков Дмитрий
Олімпієць
Звідки: Харьков
Зареєстрований: 2005-11-03
Повідомлень: 61

Re: Умные люди

Кстати, если ты, ROBOT большой любитель Delphi, могу порекомендовать проект JEDI Win32 API Library. Это куча заголовочных файлов Microsoft портированых под Delphi: http://homepages.borland.com/jedi/. Там есть и другие их проекты, например, JVCL - неплохая библиотека компонентов для Delphi на все случаи жизни.

Поза форумом

 

#16 2005-11-19 08:32:30

Vova
Олімпієць
Звідки: г. Мариуполь
Зареєстрований: 2005-11-19
Повідомлень: 27

Re: Умные люди

Как я понял ROBOT пишет свою проверялку. Я тоже ее начинал писать но бросил (не было времени). Вот кусок кода который запускает прогу (тестировал на проге из TP7):
...
    ProcessInformation: TProcessInformation;
    StartupInfo: TStartupInfo;
    ProcessH: Cardinal;
    InpH: Cardinal;
    OutH: Cardinal;
    ErrH: Cardinal;
...
{Запуск проги}
  StartupInfo.cb:=SizeOf(StartupInfo);
  StartupInfo.lpReserved:=nil;
  StartupInfo.lpDesktop:=nil;
  StartupInfo.lpTitle:=nil;
  StartupInfo.dwFlags:=STARTF_USESTDHANDLES;
  StartupInfo.cbReserved2:=0;
  StartupInfo.lpReserved2:=nil;
  InpH:=CreateFile('Input.dat',  GENERIC_READ, FILE_SHARE_READ,   nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  OutH:=CreateFile('Output.dat', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  ErrH:=CreateFile('Errors.dat', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  StartupInfo.hStdInput:=InpH;
  StartupInfo.hStdOutput:=OutH;
  StartupInfo.hStdError:=ErrH;
  StartupInfo.wShowWindow:=SW_NORMAL;
  if CreateProcess('PEREST.EXE', '', nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInformation)=False then
    RaiseLastOSError;

  ProcessH:=OpenProcess(PROCESS_ALL_ACCESS, True, ProcessInformation.dwProcessId);

{Проверка на завершение}
var
  EC: Cardinal;
begin
  if GetExitCodeProcess(ProcessH, EC)=False then
    RaiseLastOSError;
  if EC=STILL_ACTIVE then
    ShowMessage('STILL_ACTIVE')
  else begin
    CloseHandle(InpH);
    CloseHandle(OutH);
    CloseHandle(ErrH);
    CloseHandle(ProcessH);
    ShowMessageFmt('Exit Code: %d', [EC]);
  end;
end;

Единственная проблема, хоть я и назначаю StdHANDLES, прога не хочет читать и писать в заданые файлы (в ней написано запись/чтение из определенных по default-у файлов Input, Output). Запуск и ожидание завешения можно поместить в TThread.

Но если надо только запустить прогу и дождаться завершения лучше использовать WinExec и ему подобные.

PS Код писал метотом тыка. Может я чего-то не сделал?

Поза форумом

 

#17 2005-11-19 10:48:08

ROBOT
Олімпієць
Звідки: Ялта
Зареєстрований: 2005-10-26
Повідомлень: 158

Re: Умные люди

F этото код А жет проверят Delphi-проги?


I have Delphi 7, BP 7.0, FP 1.0.4, Windows XP
Мои решения олимпиад на  Паскале: http://h0h0l.narod.ru/
Моя проверялка: http://www.proveryalka.narod.ru/
ICQ: 266367671

Поза форумом

 

#18 2005-11-19 12:05:06

Vova
Олімпієць
Звідки: г. Мариуполь
Зареєстрований: 2005-11-19
Повідомлень: 27

Re: Умные люди

Этот код тупо запускает нужную прогу, и пытается переназначить I/O с консоли на файлы. Можно запускать таким способом любой exe-шник. Я решил писать проги которые надо проверить так чтобы они читали и писали в файлы, а потом считывать резельтат проверялкой. Но в таком случае не нужно переназначать файлы Input/Output и следующие строчки можно выкинуть:

  InpH:=CreateFile('Input.dat',  GENERIC_READ, FILE_SHARE_READ,   nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  OutH:=CreateFile('Output.dat', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  ErrH:=CreateFile('Errors.dat', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  StartupInfo.hStdInput:=InpH;
  StartupInfo.hStdOutput:=OutH;
  StartupInfo.hStdError:=ErrH;

А строчку:
  StartupInfo.dwFlags:=STARTF_USESTDHANDLES;
Заменить на:
  StartupInfo.dwFlags:=0;

Я скоро снова возьмусь писать проверялку и могу сообщить результат.

Поза форумом

 

#19 2005-12-08 13:11:03

ROBOT
Олімпієць
Звідки: Ялта
Зареєстрований: 2005-10-26
Повідомлень: 158

Re: Умные люди

Vova написав:

Как я понял ROBOT пишет свою проверялку. Я тоже ее начинал писать но бросил (не было времени). Вот кусок кода который запускает прогу (тестировал на проге из TP7):
...
    ProcessInformation: TProcessInformation;
    StartupInfo: TStartupInfo;
    ProcessH: Cardinal;
    InpH: Cardinal;
    OutH: Cardinal;
    ErrH: Cardinal;
...
{Запуск проги}
  StartupInfo.cb:=SizeOf(StartupInfo);
  StartupInfo.lpReserved:=nil;
  StartupInfo.lpDesktop:=nil;
  StartupInfo.lpTitle:=nil;
  StartupInfo.dwFlags:=STARTF_USESTDHANDLES;
  StartupInfo.cbReserved2:=0;
  StartupInfo.lpReserved2:=nil;
  InpH:=CreateFile('Input.dat',  GENERIC_READ, FILE_SHARE_READ,   nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  OutH:=CreateFile('Output.dat', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  ErrH:=CreateFile('Errors.dat', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  StartupInfo.hStdInput:=InpH;
  StartupInfo.hStdOutput:=OutH;
  StartupInfo.hStdError:=ErrH;
  StartupInfo.wShowWindow:=SW_NORMAL;
  if CreateProcess('PEREST.EXE', '', nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInformation)=False then
    RaiseLastOSError;

  ProcessH:=OpenProcess(PROCESS_ALL_ACCESS, True, ProcessInformation.dwProcessId);

{Проверка на завершение}
var
  EC: Cardinal;
begin
  if GetExitCodeProcess(ProcessH, EC)=False then
    RaiseLastOSError;
  if EC=STILL_ACTIVE then
    ShowMessage('STILL_ACTIVE')
  else begin
    CloseHandle(InpH);
    CloseHandle(OutH);
    CloseHandle(ErrH);
    CloseHandle(ProcessH);
    ShowMessageFmt('Exit Code: %d', [EC]);
  end;
end;

Единственная проблема, хоть я и назначаю StdHANDLES, прога не хочет читать и писать в заданые файлы (в ней написано запись/чтение из определенных по default-у файлов Input, Output). Запуск и ожидание завешения можно поместить в TThread.

Но если надо только запустить прогу и дождаться завершения лучше использовать WinExec и ему подобные.

PS Код писал метотом тыка. Может я чего-то не сделал?

У меня таже проблема ввода/вывода...
Я пытался использовать перенаправление (в CREATEPROCESS писал '"c:\proga.exe" < "c:\in.txt" > "c:\out.txt"') нничего не получилось
Решил использолвуать input.txt и output.txt
Результат: http://www.proveryalka.narod.ru

Відредаговано ROBOT (2005-12-08 13:15:02)


I have Delphi 7, BP 7.0, FP 1.0.4, Windows XP
Мои решения олимпиад на  Паскале: http://h0h0l.narod.ru/
Моя проверялка: http://www.proveryalka.narod.ru/
ICQ: 266367671

Поза форумом

 

#20 2005-12-08 21:20:11

Батыев Андрей
Олімпієць
Звідки: Харьков
Зареєстрований: 2005-11-03
Повідомлень: 70

Re: Умные люди

Писал бы ты лучше под Unix-Linux. Там все просто - fork, перенаправление ввода/вывода в файлы, exec и дочерний процесс готов. Далее считаешь время и посылаешь процессу SIGTERM или SIGKILL. Плюс проблемы с глюками в программе отваливаются сами собой - перехватом соответствующих сигналов.

Поза форумом

 

#21 2005-12-09 13:31:00

ROBOT
Олімпієць
Звідки: Ялта
Зареєстрований: 2005-10-26
Повідомлень: 158

Re: Умные люди

А если у меня Windows?


I have Delphi 7, BP 7.0, FP 1.0.4, Windows XP
Мои решения олимпиад на  Паскале: http://h0h0l.narod.ru/
Моя проверялка: http://www.proveryalka.narod.ru/
ICQ: 266367671

Поза форумом

 

#22 2005-12-09 16:11:47

Батыев Андрей
Олімпієць
Звідки: Харьков
Зареєстрований: 2005-11-03
Повідомлень: 70

Re: Умные люди

Поставь Cygwin

Поза форумом

 

#23 2005-12-09 22:25:01

jack_spektor
Олімпієць
Звідки: Украина Одесса
Зареєстрований: 2005-11-12
Повідомлень: 116
Вебсайт

Re: Умные люди

Очень полезная тут тема получилась.
Я пишу работу на  МАН (системы тестиирования) и здесь много полезного нашёл.
Ну,раз зашёл вопрос:
Кто нибудь работал с сокетами в Delphi2005.Если можно расскажите где найти учебник (или может кто-нибудь посоветует)
Заранее благадарю!!!


Delphi IT!!!
Мой сайт:http:\\mr-kody.blogspot.com

Поза форумом

 

#24 2005-12-10 07:38:06

Vitaly
Олімпієць
Звідки: Старгород
Зареєстрований: 2005-11-13
Повідомлень: 34

Re: Умные люди

Лучше пиши на API. Размер проги будет офигенно малый.
Функция отсылает на хост и порт данные data по TCP, возвращает ответ сервера.

Код:

function SendSocketTCP(host:string; port:integer; var Data:String):String;
var
     WSData:WSADATA;
     adiv:sockaddr_in;
     mysock:TSocket;
     recvstr:string;
begin
     result:='';
     wsastartup(makeword(1,1),wsdata);
     mysock:=socket(af_inet,sock_stream,ipproto_ip);
     if mysock=-1 then
     begin
          silent:=true;
          //Showmessage('Can`t create socket!');
          SetWindowText(wnd,'Can`t create socket!');
          exit;
     end;
     if (host[1]>='0') and (host[1]<='9') then
     adiv.sin_addr.S_addr:=inet_addr(pchar(host))
     else adiv.sin_addr.S_addr:=inet_addr(pchar(HostToIP(host)));
     adiv.sin_family:=af_inet;
     adiv.sin_port:=htons(port);
     if connect(mysock,adiv,sizeof(adiv))=invalid_socket then
     begin
          silent:=true;
          //Showmessage('Can`t connect to server');
          SetWindowText(wnd,'Can`t connect to server');
          Exit;
     end;
     wssendstring(mysock,data);
     recvstr:=wsrecvstring(mysock);
     result:=recvstr;
     closesocket(mysock);
     wsacleanup;
end;

О писании на апи есть куча инфы в сети.
PS: И зачем ты полез в D2005? Чего там хорошего? :-)


Кажется, админам не понравилась моя подпись. Так вот:
ROCK жил, жив и будет жить.
обо всем остальном тут выражаться не буду - не хватит места.

Поза форумом

 

#25 2005-12-10 20:35:48

jack_spektor
Олімпієць
Звідки: Украина Одесса
Зареєстрований: 2005-11-12
Повідомлень: 116
Вебсайт

Re: Умные люди

Большое спасибо!Ничего не понимаю в этих сокетах.Думаю это мне поможет!
По-поводу Дельфи2005.
Ничего хорошего там нет...
Во-первых МАН я начал писать на 2005-ом
Ну и во-вторых всё-таки там отладка сделана лучше чем в 5-ом Дельфи.
И вообще Си рулит.

Відредаговано jack_spektor (2005-12-10 20:38:04)


Delphi IT!!!
Мой сайт:http:\\mr-kody.blogspot.com

Поза форумом

 

Нижній колонтитул

Powered by Likt
© Copyright 2002–2009 Likt