线程中的synchronize(procedure A) 这个synchronize加不加为何都一样?(100分)

  • 主题发起人 主题发起人 archy
  • 开始时间 开始时间
A

archy

Unregistered / Unconfirmed
GUEST, unregistred user!
线程中的synchronize(procedure A) 这个synchronize加不加为何都一样?
我研究了《Mastering Delphi5》和138元,任不知所以然,请高手指点迷津。
另,多线程如何调试?谢谢!!!
 
《Delphi5开发人员指南》
11.2.4 与VCL同步
如同在前面多次提到的,对VCL的访问只能在主线程中。这将意味着:所有需要与用户打交道的
~~~~~~~~~~~~~~~~~~~~~~~~~
代码都只能在主线程的环境中执行。这是其结构上明显的不足,并且这种需求看起来只局限在表面上,
但它实际上有一些优点。
1. 单线程用户界面的好处
首先,只有一个线程能够访问用户界面,这减少了编程的复杂性。Win32要求每个创建窗口的线
程都要使用GetMessage()建立自己的消息循环。正如你所想的,这样的程序将会非常难于调试,因为
消息的来源实在太多了。
其次,由于VCL只用一个线程来访问它,那些用于把线程同步的代码就可以省略了,从而改善了
应用程序的性能。
2. Synchronize()方法
在TThread中有一个方法叫Synchronize(),通过它可以让线程的一些方法在主线程中执行。
Synchronize()的声明如下:
procedure Synchronize(Method:TThreadMethod);
参数Method的类型是TThreadMethod类型(这是一个无参数的过程),类型声明如下:
type
TThreadMethod=procedure of Object;
Method参数用来传递要在主线程中执行的方法。以TTestThread对象为例,如果要在一个编辑框中
显示计算的结果。首先要在TTestThread中增加能对编辑控件的Text属性进行修改的方法,然后,用
Synchronize()来调用此方法。
当你在程序中第一次创建一个附属线程时,VCL将会从主线程环境中创建和维护一个隐含的线程
窗口。此窗口唯一的目的是把通过Synchronize()调用的方法排队。
Synchronize()把由Method参数传递过来的方法保存在TThread的FMethod字段中,然后,给线程窗
口发一个CM_EXECPROC消息,并且把消息的lParam参数设为self(这里指线程对象)。当线程窗口的窗
口过程收到这个消息后,它就调用FMethod字段所指定的方法。由于线程窗口是在主线程内创建的,
线程窗口的窗口过程也将被主线程执行。因此,FMethod字段所指定的方法就在主线程内执行。

Ctrl+Alt+T 可以看到程序使用的线程,但我没有发现有什么别的用处。——在线程内部设置断点
不就行了?
 
不是很满意哦,我要你的见解
 
“synchronize加不加为何都一样?”是什么意思?
编译器对加不加 synchronize 才不管呢。
运行时不出错算您运气,出现莫名其妙的内存错误时,您就会发现synchronize的作用。
 
设想你有一个控件,公共方法为A,有两个B,C进程都调用它
syn就负责任何调用都是互斥执行的,在B调用时,C不能调用
学过操作系统就应该知道这就是信号灯
 
将DELPHI中的THREAD例子中的synchronize同步无能为力去掉试试????
让你死的笔挺。
 
agree with iie ,
continue ,
you are all outstanding
 
去掉!!!嘿嘿,总有翘辫子的那一天的。
 
完了收工了
 
VCL是线程不安全的,而如果要改成线程安全的话,代码会变得很庞大,所以就定义了个
TThread来协调各线程往VCL上画东西,如果你用到了VCL的话一定要用synchronize,否则
可以不用。
 
我想可能是因为你的线程是安全的。
 
多人接受答案了。
 

Similar threads

回复
0
查看
978
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部