多线程更新本地数据集文件错误,请大侠指点! 找客户关系管理软件
销售管理软件版1楼: 在作项目时遇到一个问题:多线程更新本地数据集时出错。
程序简介:
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状态,因此在保存更新时就出错了。
谢谢各位大侠相助。
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; //离开
程序简介:
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状态,因此在保存更新时就出错了。
谢谢各位大侠相助。
2楼: 查‘线程同步’ 如客户关系管理软件
3楼: 谢谢提醒。如果能给出具体的代码就更好了。
4楼: 顶上去,不能掉下来啊。
5楼: 多线程操作同一数据集时要加临界区或者其他方法实现同步,不然会报错。
6楼: to nicai_wgl:
能否给出具体实现代码?
销售管理软件版7楼: 如下:
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; //离开
8楼: 如果用sqlserver数据库,可以用connetion.beginTrans、commitTrans、RollBackTrans解决线程同步问题,当然调用它们时要先判断它们的事务状态。
9楼: ............
MyCds.Edit;
MyCds.FieldByName(''asdfasd'').AsString := ****;
MyCds.FieldByName(''huihi'').AsString := ****;
..................
感觉在线程中这种方式不太好,如果数据处理不太复杂的,使用其他数据类型。
10楼: 接受答案了.