如何将 TIdHTTPServer 与可视化组件一起使用?

del*_*les 1 delphi indy indy10 delphi-11-alexandria

我有一个应用程序,用于TIdHTTPServer在端口 80 上运行简单的 HTTP 服务器。我使用该OnCommandGet事件来获取命令并使用TClientDataSet.

它可以工作,但问题是,同一个应用程序具有附加到 的可视组件TClientDataSet,例如TDBGrid.

正在发生的事情是,当OnCommandGet变化时TClientDataSet.CommandTextTDBGrid需要更新,然后奇怪的事情开始发生:TDBGrid开始出现故障,表单本身开始表现奇怪。发生这种情况后,唯一的修复方法是重新启动应用程序。

我知道这可能是因为某些线程弄乱了可视组件,我知道我应该通过同步线程来避免这种情况,但我不知道如何使用TIdHTTPServer.

任何帮助将不胜感激,我不得不在白天多次重新启动我的应用程序。

Rem*_*eau 5

我知道这可能是因为某些线程弄乱了视觉组件

正确的。TIdHTTPServer是一个多线程组件,它的OnCommand...事件在工作线程中触发,因此在触摸 UI 组件时必须与主 UI 线程同步。

我知道我应该通过同步线程来避免这种情况,但我不知道如何使用TIdHTTPServer.

您可以像与任何其他工作线程一样与主 UI 线程同步 - 通过使用TThread.Synchronize()orTThread.Queue()方法或 Indy 的TIdSyncorTIdNotify类。例如:

procedure TMyForm.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequeestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  ...
  TThread.Synchonize(nil, // or TThread.Queue()...
    procedure
    begin
      ...
      ClientDataSet1.CommandText := ...;
      ...
    end
  );
  ...
end;
Run Code Online (Sandbox Code Playgroud)

另一种选择是根本不碰TClientDataSet事件OnCommandGet。为线程提供自己的专用数据库连接,并使用本地组件来查询/更新数据。让主线程在连接TDGBrid.