线程(急)!!!!! ( 积分: 100 )

  • 主题发起人 主题发起人 jiaoer840214
  • 开始时间 开始时间
J

jiaoer840214

Unregistered / Unconfirmed
GUEST, unregistred user!
Synchronize和使用临界区 有什么区别?
 
Synchronize把方法委托给主线程来执行。一般是子线程用到主线程的资源时,用此方法。除非所用到的资源是线程安全的。
临界区,是线程间同步用的,区内的代码还是在本线程执行。
 
Synchronize是子线程的数据和主线程的数据进行同步更新,如楼上所说:把方法委托给主线程来执行,而临界区是一种防止多个线程同时执行一个特定代码节的机制,使用它可以避免访问冲突,如:两个线程同时访问一处公用区域,一个线程还未对该区域的值修改完,另一个线程又对该区域的值进行了修改,造成不可预料的结果(该公用区域的值是不可预料的)。
 
procedure TMythread.Execute;
begin
begin
//方法1
EnterCriticalSection( InterlockedCrit );
Form1.Caption := IntToStr(StrToInt(Form1.Caption)+1);
LeaveCriticalSection( InterlockedCrit );
//方法2
Synchronize(UpdateCaption);
end;
end;

procedure TMythread.UpdateCaption();
begin
Form1.Caption := IntToStr(StrToInt(Form1.Caption)+1);
end;
效果为什么一样啊?
 
你要得出什么效果?同步是为了避免引起访问可视化vcl的时候发生冲突,临界区是为了访问公共资源的时候发生冲突。你不能够用一个updatecaption来做撒。就像感冒一样,很多种药都可以治疗感冒的嘛。
 
delphi世界q群23981160,欢迎朋友们
 
Synchronize是把方法委托给主线程来执行,在一个隐蔽的窗口里运行,如果委托的方法任务很繁忙,你的主窗口会阻塞掉。
 
Synchronize是VCL主线程跟当前线程的同步,临界区是线程同步。如果跟主界面做同步,只能用Synchronize,但可能会出现界面阻塞。
可以看看VCL的Thread的源码
 
jiaoer840214 自己在上面写了一个代码例子,想要从中寻找到使用Critical与使用
Synchronize的不同。结果当然无法找到任何有助于理清思路的蛛丝马迹。他自己也表示,
二者看不出区别。这是对的,看不出区别,因为例子中重现的环境,本质上是相同的。
原因很简单,对于 Caption 的操作,利用的是系统的消息循环,也等于说,是使用了
SetWindowText。也就是说,单纯地以例子上的情况来说,甚至都不需要同步、保护,
系统自己的消息循环机制,就能比较好地替你完成所有的串行化工作,尤其是在XP等
基于NT技术的操作系统中。
严格来说,即便例子改变一些,也看不出特别不同的苗头,这是因为,Synchronize利用
了系统消息机制,以串行化来对某个变量进行操作,临界区本身并不保护某个变量,它以
阻断某个二进制代码块的执行,强制多个线程串行执行该代码块。
Synchronize就像一群孩子排队去啃一张饼,大家都可以显而易见地看到这张饼,等着排队
就行了。CriticalSection却更象是一群孩子围着有守卫的一间屋子,只有领到令牌的孩子
才可以进去,而在他交出令牌前,别的孩子谁都不能进,更别说看到饼了。假如屋子里正好
有块一样的饼,对这块饼的操作,自然就与Synchronize下排队啃饼的结果一样了。
他们就是这样的不同,仔细揣摩其中的不同,对加深代码的体会和正确地运用,会有好处的。
 
同步的方法好多啊!
Synchronize
VCL类的LOCK方法
WaitFor方法
API的
临界区(Critical section)技术
互斥对象(Mutex)技术
信号量(Semaphore)技术
 
使用Synchronize方法:
该方法用于同步访问VCL主线程所管理的资源,其方法的应用是:第一步是把访问主窗口或主窗口所包含构件对象的代码放到线程的一个方法中;第二步是在线程对象的Execute方法中,通过Synchronize方法使用该方法.
示例如下:
procedure THeater.Execute;
begin
Synchronize(update);
end;
procedure THeater.update;
begin
while shap.Height< 144do

begin
shap.Height:=shap.Height+1;
shap.top:=shap.top-1;
end;
end;
定义一个THeater线程,在主窗体创建两个线程对象实例,分别用于将主窗口中用Shap构件画出的两个温度计升温.在Execute方法中,通过Synchronize方法使用Update方法使线程同步.
 
看看以下网址有关于多线程问题的介绍
[blue]http://www.topmai.cn/blog/article.asp?id=130[/blue]
 
后退
顶部