初学线程类,看了一些资料,但还有很多地方有疑问
我看了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的,但应该怎么用?

解决方案 »

  1.   

    delphi有个线程类TThread,在它上面做很简单的,没有去仔细研究用代码实现,而且它还有同步方法可供使用。
      

  2.   

    信号量不是这么用的,一般信号量用在这样的场合:多个线程竞争n个资源(n>0),比如有4个资源,那么就初始化量为4,每当线程各自请求信号量的时候,如果信号量为0,则表示没有可用的资源,请求的线程要等它其他占用者释放信号量,如果信号量大于0,则线程的请求被允许,信号量被递减,然后线程可以按约定访问资源,当线程使用资源完毕,应该释放信号量,以便其他线程需要时使用你的问题不该用信号量,用一个自动重设的事件对象和一个全局计数变量即可,先将全局变量初始化为4,
    每个线程执行1秒(这个比较难把握)以后,自觉将一个全局变量减1,如果减1后结果为0,则将变量重新设为4,触发事件的信号,然后继续执行,如果减1后结果不为0,则等待事件触发
      

  3.   

    嗯alphax,你说的很对,我想是我考虑错了那怎么把握线程执行了1秒呢我是让4个线程播放4段录像,要让录像播放同步,播放方式是用文件流载入线程进行播放,我本来想让线程每播放1秒后减一次计数器,并挂起线程,当计数器为0时,唤醒4个线程,计数器回4。播放部分是
    Replay.Play(PlayWindowTag, hPlayWindow);//开始播放
    while(ReadNumber > 0) do
    begin
      Replay.InputData(PlayWindowTag,Buffer[0],ReadNumber);//读数据
      ReadFile(hFile, Buffer,SizeOf(Buffer),readNumber,nil);
    end;