-
Валерий2202 (22.02.13 09:17) [0]Добрый день, мастера.
Используется RAD2009 и Indy10.
Подскажите, можно ли как-то вызывать в Indy10 свои потоки.
Например, мой поток описываем, как:
type
TMyIdСontext = class(TIdContext)
...
end;
Можно ли заставить Indy10 создать мой класс и вызывать его в методе Execute?
TMyForm.IdTCPServer1Execute(AContext: TIdContext);
begin
...
end;
Подскажите, пож-та. -
зачем? Видимой причины нет.
Расказывай что хочешь замутить... -
Валерий2202 (22.02.13 11:31) [2]Нужно для каждого соединение создавать коннект к базе данных. Сейчас создается список подключений на основе TList. При подключении создается поток в TList (с подключением к БД) с неким UID и при приеме данных от клиента выбирается соединение по UID и выполняется SQL. Получается, что на каждое соединение по несколько потоков. Хотелось бы, чтобы не надо было лезть в TList для создания соединения с БД и выполнения SQL, а работать напрямую из потока соединения.
Вот. -
что так не устраивает?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.
-
> Валерий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;