现在请问一个临界区的问题 ( 积分: 50 )

  • 主题发起人 主题发起人 panbq
  • 开始时间 开始时间
P

panbq

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序有一个一直运行的线程,隔段时间对数据库进行一次更新,另有一个手动更新的界面,如果在手动更新的时候,恰巧那一个一直运行的线程在更新数据库的话,就会发生错误,我想问一下,在线程里对数据库更新的时候,如何运用临界区,包括定义、实现过程,谢谢,麻烦写出代码,学习一下。
 
我的程序有一个一直运行的线程,隔段时间对数据库进行一次更新,另有一个手动更新的界面,如果在手动更新的时候,恰巧那一个一直运行的线程在更新数据库的话,就会发生错误,我想问一下,在线程里对数据库更新的时候,如何运用临界区,包括定义、实现过程,谢谢,麻烦写出代码,学习一下。
 
var
CS: TRTLCriticalSection;
begin

EnterCriticalSection(CS);
//进入临界区
.... //
LeaveCriticalSection(CS);
//离开临界区
end;

不过我感觉好象界区的代码要在线程的代码里面,不晓得是不是,因为我也很菜
 
uses SyncObjs;
cs : TCriticalSection;
initialization
cs := TCriticalSection.Create;
finalization
cs.Free;

cs.Enter;
//处理
cs.Leave;
 
避免冲突笨笨的方法:
在刷新界面时把线程挂起;在线程运行时把手动更新界面动作设置为false;
重在参与......哈哈
 
把线程中数据更新的代码和手动更新的代码都通过临界区保护起来就可以了。注意:两段代码的临界区变量(CS: TRTLCriticalSection)使用同一个。
 
私有变量定义
FLock: TRTLCriticalSection;
线程构造函数初始化
InitializeCriticalSection(FLock);
析构函数中删除
DeleteCriticalSection(FLock);
在可能会有数据读写冲突的地方使用如下把相关代码保护起来
EnterCriticalSection(FLock);
LeaveCriticalSection(FLock);
基本上就是这么多了.
 
线程体中的“定时更新”这段程序的头尾,分别用
EnterCriticalSection(CS);

LeaveCriticalSection(CS);
包起来,同时,手动更新的事件响应代码的头尾,也同样要用上面两个包起来,并且两处使用的CS变量必须是同一个
 
把用到更新的代码段都用临界区包起来,因为主程序也是一个线程,这样就可以避免冲突了
 
在线程里定义一个
在创建线程的时候创建
看这样可以么
 
多人接受答案了。
 
后退
顶部