Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Локальная сеть


Автор: Valery 26.3.2007, 21:46
Кто просвятит новичка и дохотчиво прочтет лекцию ?
Вопрос в следующем на примере:

Код

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var inputInform: string;
begin
  with AThread.Connection do
  try
     try
     inputInform := ReadLn('',1000);
        // Вызов программы "XXX" обработки с вых. парам. "YYY"
     WriteLn (YYY);
     except
         on e: Exception do
         begin
         Disconnect;
         end; 
     end; 
  finally
  Disconnect;
  end;
end;


В потоке "IdTCPServer1Execute" принимаются и обрабатываются 
сообщения от нескольких клиентов. Для обработки сообщений
в потоке вызывается внешняя программа "XXX".
Если в потоке "IdTCPServer1Execute" еще незавершена внешняя программа 
"XXX", а в это время в этом потоке пришло сообщение от другого Клиента, 
то еще раз будет вызвана незавершенная таже самая программа "XXX" ???
Если это так, то как избежать одновременного многоразового вызова 
вложенной в поток программы ?

Автор: dumb 28.3.2007, 16:54
Цитата(Valery @  26.3.2007,  21:46 Найти цитируемый пост)
В потоке "IdTCPServer1Execute" принимаются и  обрабатываются сообщения от нескольких клиентов.

IdTCPServer1Execute - это не поток, а процедура, выполняющаяся в потоке. для каждого подключившегося клиента создается свой поток, т.е., упрощенно, каждого клиента обслуживает отдельная "копия" IdTCPServer1Execute.

вызов из процедуры приема сообщений внешней программы - это, простите, моветон. smile

будет ли создаваться при этом новый процесс - зависит от вызываемой программы(подозреваю, что будет). если делать блокировку запуска "копий", то это будет неоправданно задерживать клиентов.

вобщем, настоятельно рекомендую пересмотреть все. от начала и до конца. если не хватает знаний, то попытаться привлечь более опытных товарищей.

Автор: Valery 29.3.2007, 00:14
Спасибо за ответ.
У меня задача в следующем состоит. Необходимо реализовать сеть, состоящуую из главного диспетчерного компьютера и из 50 сетевых компьютеров.  При этом главный диспетчерный компьютер и все остальные должны иметь право быть и серверами и клиентами. А именно главный комп всем остальным компам и все остальные в сторону главного компа должны иметь возможность посылать и сообщения и файлы. 
При этом каждым компом принимаемое сообщение или файл должны обрабатываться, то есть вызываться внешние программы. Базируясь на вашем опыте прошу совета и примера алгоритма для решения такой задачи. 

Автор: dumb 29.3.2007, 13:34
спасибо за оказанное доверие, конечно smile, но трудности в этой задаче кроются в основном в тонкостях реализации, а посему особой помощи "со стороны" не ожидай, т.к. реализацию делаешь ты. вспоминая опыт написания подобной системы(причем тоже на индейцах), могу сказать, что трудности возникнут - по большей части связанные с внутренним устройством серверной компоненты IdTCPServer. для правильной работы с этим компонентом(и производными от него) хорошо иметь четкие представления о "тонкостях" многопоточности.

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

если же по-плохому, в лоб, то:
кидаем на форму пару серверов, пару клиентов: одна пара - для сообщений, другая - для файлов.
делаем функцию запуска внешней программы примерно такую:
Код

proceudre execute_external(Prm: String);
begin
  EnterCriticalSection(csexec);
  //запуск... лучше использовать CreateProcess с последующим
  //ожиданием завершения с таймаутом(секунду-другую). (поиск по форуму поможет)
  //если ожидание закончилось по таймауту, то жестко убивать процесс,
  //т.к. в противном случае из-за "подвисания" внешней программы
  //твое приложение тоже повиснет.
  LeaveCriticalSection(csexec);
end;

csexec - переменная типа TCriticalSection либо глобальная, либо в классе формы, например.
не забудь сделать InitializeCriticalSection где-нибудь в конструкторе и DeleteCriticalSection в деструкторе формы...

ps. если есть доступ к исходникам "внешних программ" или точно известно, что они делают, то настоятельно рекомендую сделать "по-хорошему". smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)