AMethod(参数)tobeexecutedusingthemainthread,,therebyavoidingmulti-threadconflicts。
这里有一个问题,如果Synchronize()执行的代码很繁忙,例如执行的代码运算过于复杂、
庞大或者从中取出大量数据,不会立即返回数据时或者使用ADO组件连接
,而这时无法连接,ADO组件需要超时才会终止运行,这些都会导致主窗口
会阻塞掉,看似死机一般。因此,通常对用户界面类VCL组件的访问才使用Synchronize()
函数,一般用户界面类VCL组件都由主线程创建、存在于主窗口中,而且对VCL组件的
访问或修改的执行效率都比较高,不会过多的影响性能。绝对不能在主线程中执行
Synchronize()函数,这会导致无限循环。
Synchronize()函数一般程的Execute函数中调用。其有四个版本,两个是类函数,两
个是静态函数,声明如下:
classprocedureSynchronize(AThread:TThread;AMethod:TThreadMethod);overload;
classprocedureSynchronize(AThread:TThread;AThreadProc:TThreadProcedure);overload;
procedureSynchronize(AMethod:TThreadMethod);overload;
procedureSynchronize(AThreadProc:TThreadProcedure);overload;
AThread参数是当前线程,TThreadMethod是对象的函数指针类型,TThreadProcedure是匿
名函数类型。
注意:Synchronize()的AMethod或AThreadProc参数必须是一个无参数的procedure,
故在此procedure中无法传递参数值,通常的解决方法是程类中增加额外的成员,用其
代替参数来传递信息。
例:
type
TMyThread=class(TThread)
str:string;//额外的域,代替参数将字符串写入Memo
...
procedureTMyThread.WriteMemo;
begin
Memo.Lines.Add(str);
end;
...
procedureTMyThread.Execute;
begin
str:='Hello';
synchronize(WriteMemo);
end;
上次跟大家分享了线程的标准代码,其实程的使用中最重要的是线程的同步问题,如果你在使用线程后,发现你的界面经常被卡死,或者无法显示出来,显示混乱,你的使用的变量值老是不按预想的变化,结果往往出乎意料,那么你很有可能是忽略了线程同步的问题。
当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源。例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件中的字符数。当然,在把整个文件调入内存之前,统计它的计数是没有意义的。但是,由于每个操作都有自己的
线程,操作系统会把两个线程当作是互不相干的任务分别执行,这样就可能在没有把整个文
件装入内存时统计字数。为解决此问题,你必须使两个线程同步工作。存在一些线程同步地
址的问题,Windows提供了许多线程同步的方式。在本节您将看到使用临界区、互斥、信
号量、事件、全局原子和Synchronize函数来解决线程同步的问题。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32871-12.html
国际法并没有规定人工岛具有12海里的领海
我看你还能嚣张到什么时候
质检总局就是个假货
简直屁话