Вы также должны убедиться, что COM настроен правильно в каждом потоке с помощью вызова пары: CoInitialize / CoUnitialize
Ниже приведен пример блока для включения в ваш проект. А в конструкторе вашего HTTP-сервера просто создайте свой собственный планировщик, и Indy будет использовать его вместо значения по умолчанию.
Если вы сделаете это, то каждый поток клиента будет правильно инициализирован для COM, и вы также можете добавить другие элементы, которые будут общими для всех потоков клиента.
Я также создаю собственный потомок TIdServerContext для каждого соединения (и также устанавливаю свойство ContextClass в конструкторе HTTP-сервера.) Разные типы серверов имеют разных потомков TIdServerContext, но все они используют класс базового потока TsoIndyCOMEnabledSchedulerOfThread, как и все они. COM какой-то.
Я бы не помещал соединение ADO в поток, а скорее в контекст ... особенно если вы перенесете это дальше в пул потоков.
unit ExampleStackOverflow;
interface
uses
SysUtils, Classes,
ActiveX,
IdThread, IdSchedulerOfThreadDefault;
type
//Meant to be used with a custom TIdSchedulerOfThreadDefault descendant
//to ensure COM support on child threads.
TsoIndyComThreadWithTask = class(TIdThreadWithTask)
protected
//Ensure COM is setup before client connection/thread work
procedure BeforeExecute; override;
//Graceful COM cleanup on client connection/thread
procedure AfterExecute; override;
end;
TsoIndyCOMEnabledSchedulerOfThread = class(TIdSchedulerOfThreadDefault)
public
constructor Create(AOwner:TComponent); reintroduce;
end;
implementation
procedure TsoIndyComThreadWithTask.BeforeExecute;
begin
CoInitialize(nil);
inherited;
end;
procedure TsoIndyComThreadWithTask.AfterExecute;
begin
inherited;
CoUninitialize();
end;
constructor TsoIndyCOMEnabledSchedulerOfThread.Create(AOwner:TComponent);
begin
inherited;
//the whole reason for overriding default scheduler of thread is to setup COM
//on client threads
ThreadClass := TsoIndyComThreadWithTask;
Name := Name + 'COMEnabledScheduler';
end;