多线程更新本地数据集文件错误,请大侠指点!(100分)

  • 主题发起人 主题发起人 dywapple
  • 开始时间 开始时间
D

dywapple

Unregistered / Unconfirmed
GUEST, unregistred user!
在作项目时遇到一个问题:多线程更新本地数据集时出错。
程序简介:
MyCds: TClientDataSet;
本地数据集文件是利用TClientDataSet.SaveToFile保存的。
线程中更新数据集的代码:
MyCds.Edit;
MyCds.FieldByName('asdfasd').AsString := ****;
MyCds.FieldByName('huihi').AsString := ****;
....
MyCds.Post;
报错现象:(1)、数据集状态是Insert or Edit状态。
(2)、不匹配的操作
报错原因分析:由于多个线程使用共同的数据集MyCds更新,当某个线程在调用Post方法更新数据时恰好有另外的线程将数据集MyCds的状态改为Edit状态,因此在保存更新时就出错了。
谢谢各位大侠相助。
 
查‘线程同步’
 
谢谢提醒。如果能给出具体的代码就更好了。
 
顶上去,不能掉下来啊。
 
多线程操作同一数据集时要加临界区或者其他方法实现同步,不然会报错。
 
to nicai_wgl:
能否给出具体实现代码?
 
如下:
uses
SyncObjs;
var
MyCriticalSection: TCriticalSection;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
MyCriticalSection := TCriticalSection.Create;
end;
......
begin
MyCriticalSection .Enter;
//进入临界区
MyCds.Edit;
MyCds.FieldByName('asdfasd').AsString := ****;
MyCds.FieldByName('huihi').AsString := ****;
....
MyCds.Post;
MyCriticalSection .leave;
//离开
 
如果用sqlserver数据库,可以用connetion.begin
Trans、commitTrans、RollBackTrans解决线程同步问题,当然调用它们时要先判断它们的事务状态。
 
............
MyCds.Edit;
MyCds.FieldByName('asdfasd').AsString := ****;
MyCds.FieldByName('huihi').AsString := ****;
..................
感觉在线程中这种方式不太好,如果数据处理不太复杂的,使用其他数据类型。
 
接受答案了.
 
后退
顶部