线程同步问题 A服务产生N个日志文件,我用相同的代码创建的N个线程,去读取这N个日志文件,一旦某一个线程T1在文件里发现某个字符串,就重启一个A服务,怎么样才能保证T1在重启A服务的时候,其他线程不会再去重启A服务?谢谢!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用临界区临界区是一种最直接的线程同步方式。所谓临界区,就是一次只能由一个线程来执行的一段代码。如果把初始化数组的代码放在临界区内,另一个线程在第一个线程处理完之前是不会被执行的。在使用临界区之前,必须使用InitializeCriticalSection()过程来初始化它。其声明如下: procedure InitializeCriticalSection(Var lpCriticalSection:TRTLCriticalSection);stdcall;lpCriticalSection参数是一个TRTLCriticalSection类型的记录,并且是变参。至于TRTLCriticalSection是如何定义的,这并不重要,因为很少需要查看这个记录中的具体内容。只需要在lpCriticalSection中传递未初始化的记录,InitializeCriticalSection()过程就会填充这个记录。注意Microsoft故意隐瞒了TRTLCriticalSection的细节。因为,其内容在不同的硬件平台上是不同的。在基于Intel的平台上,TRTLCriticalSection包含一个计数器、一个指示当前线程句柄的域和一个系统事件的句柄。在Alpha平台上,计数器被替换为一种Alpha-CPU数据结构,称为spinlock。在记录被填充后,我们就可以开始创建临界区了。这时我们需要用EnterCriticalSection()和LeaveCriticalSection()来封装代码块。这两个过程的声明如下: procedure EnterCriticalSection(var lpCriticalSection:TRTLCriticalSection);stdcall; procedure LeaveCriticalSection(var lpCriticalSection:TRTLCriticalSection);stdcall;正如你所想的,参数lpCriticalSection就是由InitializeCriticalSection()填充的记录。当你不需要TRTLCriticalSection记录时,应当调用DeleteCriticalSection()过程,下面是它的声明:procedureDeleteCriticalSection(varlpCriticalSection:TRTLCriticalSection);stdcall;(摘自Delphi5开发人员指南) listview TPaxScripter Delphi现在好找工作吗???? 时间更新问题,怪了!能导入时间,但时间变了。 菜鸟问题:关于DateTimePicker控件问题 我从filelistbox拖放多个文件到treeview,结果treeview什么都显示不出,求教我得错误之处!! 关于帧控件的问题。。。。。。。。。。高手问题。。在线等待 delphi和ado的兼容性问题 代朋友问,今年的高程考试报名的具体时间?谢谢 请问DELPHI程序员必备的几本书是什么??? 关于动态数据集的问题 请问tstringgrid控件中让内容居中显示是哪个属性?
一个线程来执行的一段代码。如果把初始化数组的代码放在临界区内,另
一个线程在第一个线程处理完之前是不会被执行的。
在使用临界区之前,必须使用InitializeCriticalSection()过程来初始化它。
其声明如下:
procedure InitializeCriticalSection(Var lpCriticalSection:TRTLCriticalSection);stdcall;lpCriticalSection参数是一个TRTLCriticalSection类型的记录,并且是变参。至于TRTLCriticalSection
是如何定义的,这并不重要,因为很少需要查看这个记录中的具体内容。只需要在lpCriticalSection中传
递未初始化的记录,InitializeCriticalSection()过程就会填充这个记录。
注意Microsoft故意隐瞒了TRTLCriticalSection的细节。因为,其内容在不同的硬件平台上是
不同的。在基于Intel的平台上,TRTLCriticalSection包含一个计数器、一个指示当前线程句柄
的域和一个系统事件的句柄。在Alpha平台上,计数器被替换为一种Alpha-CPU数据结构,称
为spinlock。
在记录被填充后,我们就可以开始创建临界区了。这时我们需要用EnterCriticalSection()和
LeaveCriticalSection()来封装代码块。这两个过程的声明如下:
procedure EnterCriticalSection(var lpCriticalSection:TRTLCriticalSection);stdcall;
procedure LeaveCriticalSection(var lpCriticalSection:TRTLCriticalSection);stdcall;正如你所想的,参数lpCriticalSection就是由InitializeCriticalSection()填充的记录。
当你不需要TRTLCriticalSection记录时,应当调用DeleteCriticalSection()过程,下面是它的声明:
procedureDeleteCriticalSection(varlpCriticalSection:TRTLCriticalSection);stdcall;
(摘自Delphi5开发人员指南)