初学线程类,看了一些资料,但还有很多地方有疑问
我看了D5开发人员指南上的例子,自己试着写了一个线程程序如下
...
type
TMainForm = class(TForm)
...
public
hSem: THandle;
ThreadPlay: array[0..3] of TThreadPlay;
end;//创建线程
procedure TMainForm.Button1Click(Sender: TObject);
var i:integer;
begin
hSem:= CreateSemaphore(nil, 1, 1, nil);//我在书上看到这里是创建一个信号量,最后一个参数是 信号量对象的名称,请问是什么意思,CreateSemaphore函数返回的是一个句柄。那如果我自己想定义一个Byte类型的数作信号量,应该怎么去定义
for i:=0 to 3 do
ThreadPlay[i]:= TThreadPlay.Create(PlayWindow[i]);
end;我让4个线程同步的想法是:
设信号量的范围为0-4,我想让信号量为0时,唤醒所有线程,唤醒后同时将信号量赋值为4,每个线程执行1秒后将信号量减1,然后挂起,等待其他线程也将信号量减1,一直减到0时再同时唤醒所有线程。但这里我不知道如何去定义信号量,怎么让信号量减1,
WaitForSingleObject这个函数我看书上说是将信号量减1的,但应该怎么用?
我看了D5开发人员指南上的例子,自己试着写了一个线程程序如下
...
type
TMainForm = class(TForm)
...
public
hSem: THandle;
ThreadPlay: array[0..3] of TThreadPlay;
end;//创建线程
procedure TMainForm.Button1Click(Sender: TObject);
var i:integer;
begin
hSem:= CreateSemaphore(nil, 1, 1, nil);//我在书上看到这里是创建一个信号量,最后一个参数是 信号量对象的名称,请问是什么意思,CreateSemaphore函数返回的是一个句柄。那如果我自己想定义一个Byte类型的数作信号量,应该怎么去定义
for i:=0 to 3 do
ThreadPlay[i]:= TThreadPlay.Create(PlayWindow[i]);
end;我让4个线程同步的想法是:
设信号量的范围为0-4,我想让信号量为0时,唤醒所有线程,唤醒后同时将信号量赋值为4,每个线程执行1秒后将信号量减1,然后挂起,等待其他线程也将信号量减1,一直减到0时再同时唤醒所有线程。但这里我不知道如何去定义信号量,怎么让信号量减1,
WaitForSingleObject这个函数我看书上说是将信号量减1的,但应该怎么用?
解决方案 »
- 又一个组件开发中碰到的问题
- 用fastreport的frxPreview控件预览报表时,出现发生下列的错误:List index out of bounds (-1)Stack overflow
- 軟設考試題(二)
- sql語句
- 求救formula one6.0在安装编译的时候却出现一大堆错误
- DELPHI里的控制台程序都需要哪些文件??
- 将abc.mdb转换为abc.txt文本文件?
- 请问各位大哥大姐,好心人请进!一个可能很简单的问题。
- 如何将ClientDataSet中的Data输出生成Excel或Html文件?
- 一个数据库查询的小问题:动态查询
- SQL查询总是"超时,已过期",有什么好办法?
- dxGrid的Colums合计发生变化,是触发那个事件,,,求助啊。。。。
每个线程执行1秒(这个比较难把握)以后,自觉将一个全局变量减1,如果减1后结果为0,则将变量重新设为4,触发事件的信号,然后继续执行,如果减1后结果不为0,则等待事件触发
Replay.Play(PlayWindowTag, hPlayWindow);//开始播放
while(ReadNumber > 0) do
begin
Replay.InputData(PlayWindowTag,Buffer[0],ReadNumber);//读数据
ReadFile(hFile, Buffer,SizeOf(Buffer),readNumber,nil);
end;