-
Indy 10 (03.01.10 15:33) [0]Хочу перенести проект с 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.
Скажите, что я делаю не так? -
Сергей М. © (03.01.10 21:23) [1]
> не могу в OnIdTCPServerExecute добраться до треда TIdThread,
> который и вызвал OnIdTCPServerExecute
Что значит "не могу" ? -
Indy 10 (04.01.10 10:29) [2]Не знаю через какое свойство из TIdContext до TIdThread добраться.
-
Indy 10 (04.01.10 18:11) [3]Попробовал обратиться как здесь: http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=52807 :
TidThread(AContext.Yarn).Stop
Ничего хорошего, конечно не вышло. Больше идей нет. -
Indy 10 (04.01.10 18:35) [4]Ну, вроде нашёл :)
TIdYarnOfThread(AContext.Yarn).Thread.Stop;
Не знаю, насколько верно, но очень похоже на правду. -
Сергей М. © (04.01.10 21:53) [5]Эк тебя занесло..
А всего-то и требовалось:
TIdPeerThread(AContext).Connection.Disconnect -
Indy 10 (05.01.10 01:43) [6]
> А всего-то и требовалось:TIdPeerThread(AContext).Connection.
> Disconnect
А какое отношение AContext имеет к TIdPeerThread?
TIdContext = class(TIdTask)
TIdTask = class(TObject) -
Сергей М. © (05.01.10 18:38) [7]Короче, идешь сюда (и не вылазь оттуда, пока не разберешься в иерархии):
http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=IdContext_pas.html
и наблюдаешь там объектное св-во Connection у объекта AContext.
Так вот у объекта Connection есть метод Disconnect, вызов которого приводит к штатному завершению того самого цмкла, о котором ты ведешь речь.