《Delphi 5开发人员指南》中的线程问题(30分)

  • 主题发起人 主题发起人 virtualmfc
  • 开始时间 开始时间
V

virtualmfc

Unregistered / Unconfirmed
GUEST, unregistred user!
在《Delphi 5开发人员指南》这本书的第11章“编写多线程应用程序”中有一个”多线程与数据库“的小节,讲解
了如何利用线程进行数据库的检索工作以及利用线程更新界面。但其中的Execute()方法值得考虑。
因为按照Delphi中的说法,一般Delphi中的VCL并非线程安全的,所以应放在一个用synchronize调用的方法
当中进行处理,然而在TDBQueryThread.Execute方法中,有这么几条语句:
procedure TDBQueryThread.Execute;
begin
try
FQuery.open;
synchronize(HookUpUI);
except
...
synchronize(QueryError);
end;
end;

procedure TDBQueryThread.HookUpUI;
begin
FDataSource.DataSet := FQuery;
end;
以上这两个方法同用了VCL组件。不过一个使用了TQuery,一个使用了TDataSource,按我的想法,FQuery.Open也应放在synchronize方法之中,即
HookUpUI中,大家认为呢?或者说我对synchronize的理解有误?
 
没有关系的,主要是因为数据库类在连接时数据库时内部使用Tsession建立连接;
多线程访问数据库一般都会包含一个Tsession类。这个类负责处理多线程问题。
 
在DELPHI5中,VCL已经作到了线程安全,具体怎么做的我也不清楚,但是VCL的界面并没有做到,
也就是说,在多线程中操作跟用户界面无关的VCL控件是可以的,比如说,那个TQuery它没有关联
到任何的TDataSource,则它的打开与关闭与否是完全不影响显示的,所以它的Open方法可以在
synchronize外使用。而HookUpUI则是把Query的结果显示到跟FDataSource关联的数据敏感
控件中,因为是一个操作用户界面的过程,必须synchronize。
synchronize其实是通过操作系统对消息响应的串行性,实现多线程的安全操作用户界面的,所以
如果TQuery.Open也放在它中间的话,而这个查询是非常耗时的,那么界面的消息响应将被这个
Open方法阻塞,也就达不到使用多线程改善用户界面响应的目的了。
 
记得好象数据组件中就是这个是线程安全的(TQuery)。
 
接受答案了.
 
后退
顶部