createmutex原型_c语言mutex_createmutex(12)

电脑杂谈  发布时间:2017-02-17 02:01:51  来源:网络整理

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海里的领海

    • 李建志
      李建志

      我看你还能嚣张到什么时候

    • 张金涛
      张金涛

      质检总局就是个假货

    热点图片
    拼命载入中...