当前位置:主页>销售管理软件> 列表

多线程更新本地数据集文件错误,请大侠指点! 找客户关系管理软件

销售管理软件版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状态,因此在保存更新时就出错了。

谢谢各位大侠相助。

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楼: 接受答案了.