Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перенос проекта Indy 9 > Indy 10. Проблема с IdTCPServerExecute. [WinXP]


Indy 10 ©   (2010-01-03 15:33:00) 

Хочу перенести проект с Indy 9 / D7 на Indy 10 D2010.
Есть такая проблема: событие OnIdTCPServerExecute вызывается много раз на одно соединение, в D7 оно вызывалось только один раз.

Почему это происходит (куски кода из IdThread):


             if Loop then begin
               while not Stopped do begin
                 try
                   Run;
                 except
                   on E: Exception do begin
                     if not HandleRunException(E) then begin
                       Terminate;
                       raise;
                     end;
                   end;
                 end;
               end;


Тред создаётся с включенным флагом Loop. Дальше цикл while not Stopped бесконечно зацикливается. В Run вызывается OnIdTCPServerExecute.

Флаг Stopped же никогда не поднимается:


     Result := Terminated or (itoStopped in FOptions) or Suspended;


Terminaded или Suspended всегда False. До itoStopped in FOptions можно добраться через TIdThread.Stop. Но не могу в OnIdTCPServerExecute добраться до треда TIdThread, который и вызвал OnIdTCPServerExecute.

Скажите, что я делаю не так?


Сергей М.   (2010-01-05 18:38:00) [1]

Короче, идешь сюда (и не вылазь оттуда, пока не разберешься в иерархии):

http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=IdContext_pas.html

и наблюдаешь там объектное св-во Connection у объекта AContext.

Так вот у объекта Connection есть метод Disconnect, вызов которого приводит к штатному завершению того самого цмкла, о котором ты ведешь речь.


Indy 10   (2010-01-05 01:43:00) [2]


> А всего-то и требовалось:TIdPeerThread(AContext).Connection.
> Disconnect


А какое отношение AContext имеет к TIdPeerThread?

TIdContext = class(TIdTask)

TIdTask = class(TObject)


Сергей М.   (2010-01-04 21:53:00) [3]

Эк тебя занесло..

А всего-то и требовалось:

TIdPeerThread(AContext).Connection.Disconnect


Indy 10   (2010-01-04 18:35:00) [4]

Ну, вроде нашёл :)

TIdYarnOfThread(AContext.Yarn).Thread.Stop;

Не знаю, насколько верно, но очень похоже на правду.


Indy 10   (2010-01-04 18:11:00) [5]

Попробовал обратиться как здесь: http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=52807:

TidThread(AContext.Yarn).Stop

Ничего хорошего, конечно не вышло. Больше идей нет.


Indy 10   (2010-01-04 10:29:00) [6]

Не знаю через какое свойство из TIdContext до TIdThread добраться.


Сергей М.   (2010-01-03 21:23:00) [7]


> не могу в OnIdTCPServerExecute добраться до треда TIdThread,
>  который и вызвал OnIdTCPServerExecute


Что значит "не могу" ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо