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