del*_*les 1 delphi indy indy10 delphi-11-alexandria
我有一个应用程序,用于TIdHTTPServer在端口 80 上运行简单的 HTTP 服务器。我使用该OnCommandGet事件来获取命令并使用TClientDataSet.
它可以工作,但问题是,同一个应用程序具有附加到 的可视组件TClientDataSet,例如TDBGrid.
正在发生的事情是,当OnCommandGet变化时TClientDataSet.CommandText,TDBGrid需要更新,然后奇怪的事情开始发生:TDBGrid开始出现故障,表单本身开始表现奇怪。发生这种情况后,唯一的修复方法是重新启动应用程序。
我知道这可能是因为某些线程弄乱了可视组件,我知道我应该通过同步线程来避免这种情况,但我不知道如何使用TIdHTTPServer.
任何帮助将不胜感激,我不得不在白天多次重新启动我的应用程序。
我知道这可能是因为某些线程弄乱了视觉组件
正确的。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.