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

问题描述 投票:0回答:1

我有一个应用程序,使用

TIdHTTPServer
在端口 80 上运行简单的 HTTP 服务器。我使用
OnCommandGet
事件来获取命令并使用
TClientDataSet
返回数据。

它可以工作,但问题是,这个应用程序具有附加到

TClientDataSet
的可视组件,例如
TDBGrid

发生的事情是,当

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

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

TIdHTTPServer
来做到这一点。

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

delphi indy indy10 delphi-11-alexandria
1个回答
0
投票

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

正确。

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

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

TIdHTTPServer
来做到这一点。

您可以像与任何其他工作线程一样与主 UI 线程同步 - 通过使用

TThread.Synchronize()
TThread.Queue()
方法,或 Indy 的
TIdSync
TIdNotify
类。例如:

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

另一种方法是根本不触摸

TClientDataSet
事件中的
OnCommandGet
。为线程提供自己的专用数据库连接,并使用本地组件来查询/更新数据。连接
TDGBrid
时让主线程使用自己的数据库连接。

© www.soinside.com 2019 - 2024. All rights reserved.