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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Indy и многопоточное приложение 
V
    Опции темы
gashik
Дата 10.8.2011, 03:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите пожалуйста, как можно заставить инди вернуть результат, после выполнения потока созданого после прихода запроса? И как завершить сам поток инди?

Код

Unit MainServer;

type
  TMainForm = class(TForm)
  ...
  procedure IdHTTPServer1CommandGet(AThread: TIdPeerThread;
      ARequestInfo: TIdHTTPRequestInfo;
      AResponseInfo: TIdHTTPResponseInfo);
  ...
implementation
  {$R *.dfm}

uses ServerTread;
...

procedure TMainForm.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  NewThread:TerminalTread;
  ThreadID:cardinal;
begin
     //это нужно для созданного далее треда
      path:=ARequestInfo.Params.Values['path'];
      save_to_file(path);
      NewThread:=TerminalTread.Create(false);
      ThreadID:=NewThread.ThreadID;
  //собственно суть вопроса, нужно чтоб ответ сервера был только после завершения потока
       AResponseInfo.ContentText:='Ok';

      // а где-то здесь, имхо, должен завершаться поток, созданный CommandGet

       
end;


Код

unit ServerTread;
...
procedure TerminalTread.Execute;
begin
  FreeOnTerminate:=True;
  Start();
  ...

  Synchronize(Update);
  ...
  FinishTerminal();
  //собственно здесь поток завершает работу по принципу "выполнить и забыть"
end;

PM MAIL   Вверх
Mifody
Дата 10.8.2011, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



как предложение
в классе потока завести переменную, к примеру fMyResult : string;
перед строкой Synchronize(Update); 
добавить:
Код
fMyResult := 'какиет там данные, не знаю какие, может и не строковая переменнав';

в методе Update добавить:
Код

// myVar - глобальная переменная объявленная в модуле ServerTread
myVar := fMyResult;

это как предать данные.
Если требуется ждать пока отработает поток, и продолжать работу только после выполнения. Тогда, чтоб не втыкать бесконечные циклы и не подвешивать основной код - лучше делать на событиях. По моему, может я и ошибаюсь.
PM MAIL WWW   Вверх
gashik
Дата 10.8.2011, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


Код

procedure TerminalTread.TerminatedThread;
begin
   AResponseInfo.ContentText:='Ok';
end;

procedure TerminalTread.Execute;
begin
  ...

  Synchronize(TerminatedThread);
end;

только как вот этот AResponseInfo.ContentText:='Ok';  вызвать, да еще и чтоб он отдал ответ запросившему клиенту, а не другому подключившемуся?

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

Это сообщение отредактировал(а) gashik - 10.8.2011, 11:55
PM MAIL   Вверх
gashik
Дата 10.8.2011, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Оказалось все очень просто:

Код

      NewThread:=TerminalTread.Create(str);
      NewThread.WaitFor;
      NewThread.Free;
      NewThread:=nil;


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

Запрещено:

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

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

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

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

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


 




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


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

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