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

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

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

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2009, 23:44   #1
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию Дочерний процесс. Создание и "слежение"

Доброго времени суток товарищи!!!
Начну описывать проблему с самого начала (возможно в каких нибудь моментах вы меня подправите).
Итак, задачу я себе поставил (в учебных целях) попытаться создать систему распределенных вычислений.
Для себя представляю решение в виде клиент-серверной концепсии. Сервер раздает задачи клиентам... (вот тут один из спорных моментов ) я хотел в виде DLL и пусть типо в отдельных нитях клиенты их обратабатывают, но препод посоветовал типо пусть задачи в виде exe-шников раздает и те будут результаты вычислений в файл записывать и эти данные из файла потом будет клиентская программа доставать и высылать серваку. И вот собственно вопрос...
Допустим для создания дочернего процесса я использую ShellExecute, а вот потом как мне "отловить" момент (событие) конца выполнения EXE-шника, что бы потом клиентская программа "с чистой совестью" молга взять данные и выслать???
Помог? Ну так нажми на весы!

Последний раз редактировалось mihali4; 10.12.2009 в 00:25.
SNUPY вне форума Ответить с цитированием
Старый 10.12.2009, 00:25   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Допустим, для создания дочернего процесса я использую ShellExecute
Полная чепуха. Никто вам не даст ставить себе клиента с непонятными целями (мало ли, что вы там наплетете в своей рекламе, на это - наплевать и растереть ).
Я, например, (в целях безопасности своей системы), могу только скачать некий "вычислительный" блок, но запускать его я буду по своему желанию, когда он не будет мне мешать. И выхода в инет я ему не дам! (Это помимо всяческих его проверок...)
А результаты буду отсылать опять-таки, когда моя левая нога этого возжелает...
И ничего "отлавливать" я вам не позволю! Так преподу своему и скажите...

Последний раз редактировалось mihali4; 16.12.2009 в 00:11.
mihali4 вне форума Ответить с цитированием
Старый 10.12.2009, 00:46   #3
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Нуу... а допустим ночь.... вы спите и вы согласны что бы ваш ПК помог кому-нибудь в вычислении и вот бум процесс завершился.... ждать пока ваша левая нога пожлает при том, условии что вы поставили скажем галочку потверждающую то, что в это время вы готовы отдать вычислительные мощности вашего ПК на решение выслаемых задач???

Код:
И выхода в инет я ему не дам! (Это помимо всяческих его проверок...)
Эмм тут так написано, что сам вычислительный блок должен выходить в инет ^__^.... Вообще предполагалось, что связь с сервером будет держать только клиент, а не сам EXE с заданием =)))....

Препод мотивирует тем, что запуск дочерних процессов отгородит возможность "падения" клиента из-за ошибки в высланной задаче =)))
Помог? Ну так нажми на весы!

Последний раз редактировалось SNUPY; 10.12.2009 в 00:49.
SNUPY вне форума Ответить с цитированием
Старый 10.12.2009, 01:13   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
потом будет клиентская программа доставать и высылать серваку
Звиняйте, проходили...
Именно это я и имел в виду, когда упомянул "И выхода в инет я ему не дам!"
Участвовал (по дури) в так называемых "распределенных вычислительных сетях".
"Хацкеры" на выдумку хитры... (Национальную принадлежность не стоит уточнять? Америкосам ловить нечего. Они, кроме слизанного с НЛО вычислительного блока, ничего своего придумать не могут... Славянские народы - это единственные, кто еще может придумать что-то новое. Кстати, взять хотя бы Великого Теслу...).
mihali4 вне форума Ответить с цитированием
Старый 10.12.2009, 01:31   #5
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Код:
Звиняйте, проходили...
Именно это я и имел в виду, когда упомянул "И выхода в инет я ему не дам!"
Участвовал (по дури) в так называемых "распределенных вычислительных сетях".
"Хацкеры" на выдумку хитры... (Национальную принадлежность не стоит уточнять? Америкосам ловить нечего. Они, кроме слизанного с НЛО вычислительного блока, ничего своего придумать не могут... Славянские народы - это единственные, кто еще может придумать что-то новое. Кстати, взять хотя бы Великого Теслу...).
Товарищ, я все это прекрасно понимаю, но я же сказал, что я только для учебных целей этим занимаюсь, так сказать для расширения собственного кругозора и руку набить =))) просто больше интересной задачи для применения Indy не нашел + возможно получу автомат по ТИПС.... Мне не суть как важна безопасность... мне по большей степени руку набить, т.к. практической нагрузки эта прога нести не будет, как максимум учебный стенд =)))
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 10.12.2009, 01:37   #6
MadReason
Ищу работу
Форумчанин
 
Аватар для MadReason
 
Регистрация: 16.02.2007
Сообщений: 269
По умолчанию

Цитата:
Допустим для создания дочернего процесса я использую ShellExecute, а вот потом как мне "отловить" момент (событие) конца выполнения EXE-шника, что бы потом клиентская программа "с чистой совестью" молга взять данные и выслать???
а почему бы экзешнику самому не говорить что он "кончил"? например записыванием какого нибудь файла рядом с собой. или при завершении не вызвать какую-нибудь процеду из dll'ки клиента. или отправить сообщение процессу какоинить.
на крайняк клиентская прога может отследить жив ли процесс.


GetExitCodeProcess(hProcess, ExitCode);
если ExitCode = STILL_ACTIVE тогда процесс еще не завершен.
hProcess-хендл процесса


а вот пример как запустить экзешник и ожидать его завершения
Код:
function WinExecAndWait32(FileName:String; Visibility : integer):integer;
var
rez:cardinal;
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,rez);
result:=rez;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
if WinExecAndWait32('notepad.exe',1)=-1 then
ShowMessage('файл не найден');
end;
Пишу на Delphi все что угодно, недорого, красиво, с комментариями
###icq 107335###
MadReason вне форума Ответить с цитированием
Старый 10.12.2009, 11:21   #7
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

MadReason, скока я понимаю ваш вариант остановит выполнение программы до тех пор пока не завершится дочерниц процесс. В контесте моей задачи придеться передавать пуск дочерних процессов на отдельные нити, что бы не застопорить саму программу, я правильно понимаю?
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 15.12.2009, 23:44   #8
MadReason
Ищу работу
Форумчанин
 
Аватар для MadReason
 
Регистрация: 16.02.2007
Сообщений: 269
По умолчанию

правильно. извиняюсь что долго без ответа)
Пишу на Delphi все что угодно, недорого, красиво, с комментариями
###icq 107335###
MadReason вне форума Ответить с цитированием
Старый 16.12.2009, 13:17   #9
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
...Участвовал (по дури) в так называемых "распределенных вычислительных сетях".
"Хацкеры" на выдумку хитры... (Национальную принадлежность не стоит уточнять? ...
Ну если Вы попались на удочку хацкеров, это еще не значит, что распределенные вычисления это плохо. С таким подходом и почтой пользоваться нельзя - с помощью нее передается куча спама.
Насколько знаю самые мощные компьютеры работают на основе кластерных технологий.
Если SNUPY напишет хорошую систему, то ей вполне можно найти применение:
- если в учебном заведении есть компьютерная сеть, то факультет физики ( химии ... ) может воспользоваться разработанной и проверенной преподавателями системой для своих вычислений
- каждый из учащихся и преподавателей сможет тоже подсоединиться через интернет к этим вычислениям через интернет ( только надо будет для этого проработать какую-нибудь защиту ).
- любая группа единомышленников может решать распределенные задачи.
Главное пользоваться надежной системой из надежных источников, а не брать что попало на первом же сайте.

Теперь по существу:
Как я понимаю, на одном компьютере находится сервер. Его задачи:
- хранить задания на вычисления ( которые состоят из алгоритма вычисления и исходных данных ).
- распределять задания клиентам и при необходимости выдавать для них новые исходные данные.
- получать и объединять результаты вычислений.
- вести, отображать и выдавать по требованию текущее состояние вычислений и статистику.

Клиенты находятся на других компьютерах, объединенных в сеть:
- позволяют настраивать процесс вычислений, возможно с применением планировщика. ( задание количества одновременно решаемых задач, нагрузка на процессор ( приоритеты нитей ), нем меньше, чтоб не мешало... )
- отображают текущее состояние и статистику
- соединяются с сервером и получают вычислительные модули ( в виде exe или dll )
- запускают вычисления, передают им исходные данные и получают результаты
- получают от сервера необходимые исходные данные и передают результаты.
Что упустил - добавите.
Реализовывать можно постепенно.

Почему модули вычислений и исходные данные:
Например, решается задача нахождения всех простых чисел.
Создается функция проверяющая числа в заданном диапазоне и выдающая найденные простые числа.
Клиент получает эту функцию, получает первый диапазон ( 10^6 - 2*10^6 ) обрабатывает этой функцией, передает результаты иполучает следующий диапазон.

Преимущества использования dll ( мое мнение ):
По системе плагинов можно динамически подключить, запустить в отдельной нити и предоставить общий интерфейс взаимодействия с сервером - при этом в самой dll не надо дублировать общие для всех методы, а останется только сами вычисления, что уменьшит размер.

Ожидание процесса с обработкой сообщений:
Код:
procedure MsgWaitForSingleObject(Handle: THandle);
begin
  repeat
    if MsgWaitForMultipleObjects( 1, Handle, False,
                                  INFINITE, QS_ALLINPUT)
       = WAIT_OBJECT_0 + 1
      then Application.ProcessMessages
      else BREAK;
  until True = False;
end; // MsgWaitForSingleObject
Использование для приведенного выше ( в место WaitforSingleObject(ProcessInfo.hPr ocess,INFINITE); )
Код:
MsgWaitForSingleObject(ProcessInfo.hProcess);
Для созданной нити:
Код:
MsgWaitForSingleObject(MyThread.Handle)
s.Creator вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Delphi. Создание нового класса, его "предков". Krechet Помощь студентам 0 26.04.2009 15:52
Динамическое создание "суб-меню" из файлов в заданном каталоге Abhorrer Общие вопросы Delphi 5 14.03.2009 21:47
блок "cont" с права не принимает значение "margin: 10px;" которое описано в body tabikA HTML и CSS 5 24.02.2009 21:50
Программа, выполняет дочерний процесс IgorArhangel Помощь студентам 3 24.01.2009 23:12