Конференция "Сети" » Перенос проекта Indy 9 > Indy 10. Проблема с IdTCPServerExecute. [WinXP]
 
  • 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, вызов которого приводит к штатному завершению того самого цмкла, о котором ты ведешь речь.
 
Конференция "Сети" » Перенос проекта Indy 9 > Indy 10. Проблема с IdTCPServerExecute. [WinXP]
Есть новые Нет новых   [134438   +31][b:0][p:0.001]