关于多线程的问题,我想定期激活一个线程,

Realot_11 2003-01-06 04:49:18
一个线程,执行完一段时间后,我想让它暂定执行,在一定时间间隔后,在次激活执行,如此反复执行,直到手动结束为止,该如何实现?
...全文
15 点赞 收藏 27
写回复
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
hehou 2003-05-12
upp
回复
Realot_11 2003-01-17
哦,我明白了,十分感谢。
回复
Realot_11 2003-01-16
我原来是将InitializeCriticalSection(CriticalS);语句放在线程的Create中,所以没有起到效果,如你的例子我试了一下,问题解决了。但是我还是想知道为什么?
知道后马上结账。
谢谢
回复
Realot_11 2003-01-16
请问,我在interface和implementation中声明的变量有什么不同吗?
另外:以下两句话的意思是什么?

initialization
InitializeCriticalSection(CriticalS);
finalization
DeleteCriticalSection(CriticalS);
这两句话要放在什么地方?
我试了一下,好像只能放在最后,也就是end.的前面。
回复
jackystar 2003-01-16
up
回复
zwjchina 2003-01-16
我所写的Unit1的名字只是随手写的,你完全可以在线程类的单元文件的
interface部分声明临界区变量,你可以让整个线程类的单元文件
的结构写成如上我写的那样。
回复
Realot_11 2003-01-16
谁能在给我一个提示?
回复
zwjchina 2003-01-16
initialization
是指一个本单元在被引用时作一些初始化工作,
finalization
是释放initialization初始化时所用的资源,其格式固定如我上面给你写的那样
也就是说Delphi中一个Unit的完成格式如下:
Unit UnitName
interface
uses
...
const
...
type
...
var
...
implementation
...
initialization
...
finalization
...
end.
一个临界区变量只能被初始化一次,如果你在Create中写,则创建2个线程
时就会初始化2次。
回复
zwjchina 2003-01-15
一个线程类和一个线程是有区别
例如可以有多个线程,但是这些线程都是同一个线程类。

记住:
临界区要初始化:
在interface部分声明
var
CriticalS: TRTLCriticalSection;

在初始化部分
InitializeCriticalSection(CriticalS);

最后你还要DeleteCriticalSection(CriticalS);

例如文件结构可以为:
unit Unit1

interface

uses
.....;

type
....;
var
CriticalS: TRTLCriticalSection;
implementation
....;
initialization
InitializeCriticalSection(CriticalS);
finalization
DeleteCriticalSection(CriticalS);
end.


举个例子吧:
如果你的线程类方法如下:

procedure Thread.Execute
begin
do something;
EnterCriticalSection(CriticalS);
访问共享资源
LeaveCriticalSection(CriticalS);
do something;
end;
解释一下,如果说你创建了2个Thread线程(这2个线程都是基于该线程类的)
当一个线程执行到EnterCriticalSection(CriticalS);进入了临界区
正在访问共享资源的时候,第2个线程也运行到这里,也调用了EnterCriticalSection,但是由于CriticalS已经被其他线程进入,所以该线程只有暂时阻塞,等待其他线程离开临界区,当第一个线程访问完共享资源,调用LeaveCriticalSection的时候,第2线程就可以进入临界区,并访问共享资源。
回复
Realot_11 2003-01-15
To: zwjchina(蒲石)
如你所举例子,你是在Unit1中定义
var
CriticalS: TRTLCriticalSection;
的,而在线程类中你直接使用了

EnterCriticalSection(CriticalS);
访问共享资源
LeaveCriticalSection(CriticalS);
这样可以吗?
因为我的线程类是另外一个文件,我在主界面也就是Unit1中引用了这个线程类.CriticalS这个参数如何使用到线程类文件中 .

谢谢你的热心.

回复
TonyWzz 2003-01-15
再建一个唤醒线程好了!
回复
Realot_11 2003-01-14
谢谢楼上的这位兄弟,我先查查资料。
请大家多给些建议。
回复
zwjchina 2003-01-14
多个线程对同一资源进行访问时,要进行同步处理
你可以使用临界区或者互斥元等方法
临界区你可以查看InitializeCriticalSection函数的相关帮助
互斥元可以查看CreateMutex的相关帮助
回复
Realot_11 2003-01-14
我现在有一个问题,我首先创建了一个线程类文件,在主程序中调用这个线程类文件,所有主要程序都在这个线程类中调用,这样的话,如何使用临界区进行线程同步?
我看过例子都是在主程序中使用的临界区,如何在线程类文件中实现??
回复
zwjchina 2003-01-13
一个定时器就够了,多个线程在挂起前访问一个列表,然后再挂起,
挂起前记录本线程挂起时的时间,下次激活的时间或者其他什么激活条件等信息。
定时器定时轮询该列表,满足条件则激活.
回复
Realot_11 2003-01-13
我还想问一下,能够知道从一个线程挂起到现在的时间吗?
回复
Realot_11 2003-01-13
现在的问题是,我在线程中用到了一个AdoDataSet控件,这样在我创建线程时由于我对每一个线程传递的控件是同一个,所以总是报错.难道说我想创建15个线程,那么我就的预先在程序里设置有15个AdoDataSet控件?
那样的话,线程还有什么优势?特别是在我不知道要创建多少个线程时.
那位有更好的解决办法?
回复
Sumie@Sam 2003-01-10
Sleep()不错!
回复
Realot_11 2003-01-10
To: sunhuiNO1(2B)
时间线程池函数是什么?那里能找到资料???
回复
Realot_11 2003-01-10
老兄们:谁能在给我点建议??
回复
发动态
发帖子
网络通信/分布式开发
创建于2007-08-02

1565

社区成员

Delphi 网络通信/分布式开发
申请成为版主
社区公告
暂无公告