Конференция "Сети" » Вызов собственного потока наследника от TIdContext в Indy10 [WinXP]
 
  • Валерий2202 (22.02.13 09:17) [0]
    Добрый день, мастера.
    Используется RAD2009 и Indy10.
    Подскажите, можно ли как-то вызывать в Indy10 свои потоки.
    Например, мой поток описываем, как:

    type
     TMyIdСontext = class(TIdContext)
     ...
     end;



    Можно ли заставить Indy10 создать мой класс и вызывать его в методе Execute?


    TMyForm.IdTCPServer1Execute(AContext: TIdContext);
    begin
     ...
    end;


    Подскажите, пож-та.
  • Slym © (22.02.13 11:23) [1]
    зачем? Видимой причины нет.
    Расказывай что хочешь замутить...
  • Валерий2202 (22.02.13 11:31) [2]
    Нужно для каждого соединение создавать коннект к базе данных. Сейчас создается список подключений на основе TList. При подключении создается поток в TList (с подключением к БД) с неким UID и при приеме данных от клиента выбирается соединение по UID и выполняется SQL. Получается, что на каждое соединение по несколько потоков. Хотелось бы, чтобы не надо было лезть в TList для создания соединения с БД и выполнения SQL, а работать напрямую из потока соединения.
    Вот.
  • Slym © (22.02.13 12:49) [3]
    что так не устраивает?
    TMyForm.IdTCPServer1Execute(AContext: TIdContext);
    var Con:TADOConnection;
    begin
     Con:=TADOConnection.Create(nil);
     try
     ...
     finally
       Con.Free;
     end;
    end;

  • Валерий2202 (22.02.13 14:09) [4]
    Насколько мне известно эта процедура выполняется в цикле. Т.е. если так делать, то для каждого выполнения будет создаваться соединение и потом разрываться. А хочется, чтобы соединение создавалось при подключении и разрывалось при отключении.
  • Валерий2202 (22.02.13 14:09) [5]
    Поправьте, если я не прав по поводу процедуры Execute.
  • DVM © (22.02.13 23:12) [6]

    > Валерий2202   (22.02.13 09:17) 

    IdTCPServer.ContextClass := TMyIdСontext ;
  • Валерий2202 (23.02.13 08:31) [7]
    Попробовал вот так:

    procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
    begin
     TMyContext(AContext).IP := AContext.Connection.Socket.Binding.PeerIP;
     Memo1.Lines.Add(TMyContext(AContext).IP);
    end;


    Вроде работает. Спасибо.
  • Eraser © (23.02.13 08:45) [8]

    > Валерий2202   (22.02.13 14:09) [5]

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


    procedure TdmMain.IdServerExecute(AContext: TIdContext);
    begin
     try
    ...
     finally
       // OnExecute весьма странно устроен и имеет свойство иногда зацикливаться
       // даже после того, как его нужно отключить. Чтобы избежать этого нужно
       // вызвать искусственное исключение. Это гарантированно остановит вызов
       // OnExecute в цикле.
       raise EMyDisconnectException.Create('IdServerExecute close.');
     end;
    end;

 
Конференция "Сети" » Вызов собственного потока наследника от TIdContext в Indy10 [WinXP]
Есть новые Нет новых   [118461   +17][b:0][p:0.002]