Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Локальная сеть, INDY 
:(
    Опции темы
Valery
Дата 26.3.2007, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 31.7.2006

Репутация: нет
Всего: нет



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

Код

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" ???
Если это так, то как избежать одновременного многоразового вызова 
вложенной в поток программы ?

Это сообщение отредактировал(а) Girder - 30.3.2007, 16:02
PM MAIL   Вверх
dumb
Дата 28.3.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 5
Всего: 158



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

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

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

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

вобщем, настоятельно рекомендую пересмотреть все. от начала и до конца. если не хватает знаний, то попытаться привлечь более опытных товарищей.
PM MAIL   Вверх
Valery
Дата 29.3.2007, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 31.7.2006

Репутация: нет
Всего: нет



Спасибо за ответ.
У меня задача в следующем состоит. Необходимо реализовать сеть, состоящуую из главного диспетчерного компьютера и из 50 сетевых компьютеров.  При этом главный диспетчерный компьютер и все остальные должны иметь право быть и серверами и клиентами. А именно главный комп всем остальным компам и все остальные в сторону главного компа должны иметь возможность посылать и сообщения и файлы. 
При этом каждым компом принимаемое сообщение или файл должны обрабатываться, то есть вызываться внешние программы. Базируясь на вашем опыте прошу совета и примера алгоритма для решения такой задачи. 
PM MAIL   Вверх
dumb
Дата 29.3.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 5
Всего: 158



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

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

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

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

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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0631 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.