线程与同步 ( 积分: 100 )

  • 主题发起人 主题发起人 HongYuan
  • 开始时间 开始时间
H

HongYuan

Unregistered / Unconfirmed
GUEST, unregistred user!
我定义了一个类TA1存储着一些数据,现在使用线程TT1每1秒刷新一次数据,而有很多其它类TA1,TA3,线程TT2都调用到这个类实例A1的数据,请问是否需要同步?
另,如果A1的数据被显示在窗体Form上面,并且可以通过FORM上的控件修改A1的数据,那么是否使用Synchronize?
其实,我一直不太明白Synchronize与临界区(critical section)等三种同步方法的关系?
 
看一看delphi开发人员指南就知道了
 
Synchronize一般是在需要操纵form中的vcl时用,而criticalsection是多线程访问全局变量以防冲突才用的阿,其实我也不怎么懂 呵呵
 
你这个要用同步;不然数据可能出现重复读和丢失读的现象
至于你说的同步方法的关系 jainibunan已经做了回答
可以是就是给他加了一个排它锁
 
可以考虑用 Thread 的 TList
 
我正在尝试使用TMultiReadExclusiveWriteSynchronizer,不知道是否合理?
 
因为是封装在DLL里,Synchronize是无法使用的。
 
线程同步可以理解为,暂停当前线程,将执行点抛给主线程,主要是为了解决VCL中的线程安全问题而作的
临界区--一般是用于处理进程内的线程同步,达到各线程的数据共享的目标.
----------个人见解,有错请斧证,谢谢.
 
需要同步的理由是: 多个线程对同一资源进行读写操作是,因不可预知性才需进行同步!
看看Synchronize的代码其实它用的也是临界区和事件来操作的.
至于你说的:"另,如果A1的数据被显示在窗体Form上面,并且可以通过FORM上的控件修改A1的数据,那么是否使用Synchronize?"
我还没听明白....
 
需要使用临界区,否则会访问冲突
CRITICAL_SECTION cs;
//定义成全局的,
InitializeCriticalSection( &cs );
//初始化
//所有要处理共享数据的地方
EnterCriticalSection( &cs );
//处理数据
LeaveCriticalSection( &cs );
 
CRITICALSECTION: TRTLCritialSection //定义成全局的,
//所有要处理共享数据的地方
EnterCriticalSection( CRITICALSECTION );
//处理数据
LeaveCriticalSection( CRITICALSECTION );
Initialization
InitializeCriticalSection(CRITICALSECTION );
//初始化
finalization
DeleteCriticalSection(CRITICALSECTION);
 
大家都很热心,解释的相当清楚。[:D]
 
TMultiReadExclusiveWriteSynchronizer delphi5开始出现... 不过据说这个东西写得不怎么好....delphi7把它"藏的很深",很少使用...
 
TMultiReadExclusiveWriteSynchronizer 解释一下,听讲
 
晕倒
怎还没结贴哦
 
TDllPatch = class(TComponent)
private
FApp: TApplication;
FOnMessage: TMessageEvent;
FOnIdle: TIdleEvent;
proceduredo
Idle(Sender: TObject;
vardo
ne: Boolean);
proceduredo
Message(var Msg: TMsg;
var Handled: Boolean);
public
constructor Create(App: TApplication);
overload;
destructor Destroy;
override;
end;

var
DllPatch: TDllPatch;
{ TDllPatch }
constructor TDllPatch.Create(App: TApplication);
begin
inherited Create(App);
FApp := App;
FOnMessage := FApp.OnMessage;
FOnIdle := FApp.OnIdle;
FApp.OnMessage :=do
Message;
FApp.OnIdle :=do
Idle;
FApp.HookSynchronizeWakeup;
end;

destructor TDllPatch.Destroy;
begin
if DllPatch = Self then
DllPatch := nil;
FApp.OnMessage := FOnMessage;
FApp.OnIdle := FOnIdle;
inherited;
end;

procedure TDllPatch.DoIdle(Sender: TObject;
vardo
ne: Boolean);
begin
if Assigned(FOnIdle) then
FOnIdle(Sender,do
ne);
if (GetCurrentThreadID = MainThreadID) and CheckSynchronize then
do
ne := False;
end;

procedure TDllPatch.DoMessage(var Msg: TMsg;
var Handled: Boolean);
begin
if Assigned(FOnMessage) then
FOnMessage(Msg, Handled);
if Handled then
Exit;
Handled := True;
case Msg.message of
WM_NULL:
CheckSynchronize;
else
Handled := False;
end;
end;

然后在exe中导出一个函数GetApplication,在
Initialization
DllPatch := TDllPatch.Create(GetApplication);
Synchronize就可以用了,我是这么干的,我们的问题是出在在Dll中使用了SocketConnection,又不好改它的源代码,只能将就这么用了,最好的解决方式是带包编译
 
后退
顶部