关于队列问题。(实在没分了,大家帮忙吧) ( 积分: 10 )

  • 主题发起人 主题发起人 xf47
  • 开始时间 开始时间
X

xf47

Unregistered / Unconfirmed
GUEST, unregistred user!
我想实现这样:
一个缓冲区,两个线程。
第一个线程向缓冲区写入数据,一次写入缓冲区大小的1/128,写满后等待;第二个线程从缓冲区读取数据,一次读取缓冲区大小的1/128,读取完毕后删除已读取的这1/128,并可以让第一个线程继续向缓冲区内写入数据。
现在有这个想法,不知道如何实现,请各位大侠给出提示,有例子更好。
可用积分只有这点了,请大家无私的帮助一下。再次感谢。
 
我想实现这样:
一个缓冲区,两个线程。
第一个线程向缓冲区写入数据,一次写入缓冲区大小的1/128,写满后等待;第二个线程从缓冲区读取数据,一次读取缓冲区大小的1/128,读取完毕后删除已读取的这1/128,并可以让第一个线程继续向缓冲区内写入数据。
现在有这个想法,不知道如何实现,请各位大侠给出提示,有例子更好。
可用积分只有这点了,请大家无私的帮助一下。再次感谢。
 
楼主很守信用的,到我的帖子领分[:)]
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3206900
 
感谢老哥
这样的数据排队问题应该怎么实现呢?
 
用信号量应该可以实现你的需求吧。具体需求还不是看的很清楚
 
Api函数WriteFile如果是同步的话,会等写完返回,如果是异步就不等返回,好像是最后一个参数,这个是一
在线程中,因为不能用全局变量作为信号标志(原理记不得了),所以就有许多另外的信号量,一般是通过哪些信号量来处理,好像有3钟,我只记得TCriticalSection,用的时候
创建一个实例,然后Enter,用完Leave,好像是这样,个人看法,供参考
 
这个我知道,应该是用在线程同步和互斥里。我的需求不是这个阿,看样我说的不太明白。郁闷
 
线程同步和互斥的原理就是这个,但是如何用程序去实现,俺也不知道,请高手回答!
 
type
TMyRecord = record
//你的数据声明
end;

var
TMyBuffer : TList;
csBuffer : TCriticalSection;

用队列来管理你的缓冲区(TMyBuffer.Add,TMyBuffer.Delete),用临界区访问控制线程对队列的访问(csBuffer.Enter,csBuffer.Leave)。应该没多大难度^_^
 
hevt:Thandle;//事件的handle,全局的,用createevent得到,如下:
hevt:=CreateEvent(nil,false,true,nil);
procedure WriteThread.execute();//写入的线程函数
begin
while not terminateddo
begin
//判断是否结束
waitforsingleobject(hevt,INFINITE);
//判断缓冲区是不是满的,不是就写满
end;
end;

procedure ReadThread.execute();//读取的线程函数
begin
while not terminateddo
begin
//判断是否结束
//判断缓冲区是不是空的,不是就begin
读取并删除;
setevent(hevt);
end;
end;
end;

这里我们选用信号量来同步,信号量的优点是可以跨越进程实现同步,还可以同时同步多个线程(设置成manualreset),实现相对简单。上面我只实现了读取对写入的同步,如果缓冲区长时间空闲,读取线程会始终循环,浪费系统资源,所以还应该实现反向同步,但是千万注意不要锁死,应该保证至少一个信号是激活的。
这里为了说明信号量的用法才写了那么多,其实本贴问题的解决根本不需要这些,只要通过线程消息就完全能够满足需要:
把上面waitforsingleobject那行替换成while getmessage(@msg,0,0,0)do
begin
;
setevent那一行改成postthreadmessage(threadID,WM_Data,0,0)就可以了
while terminated可以去掉,因为直接发送WM_Quit给线程,getmessage就会返回false-直接结束了,简单吧?
WM_data是自定义消息,大于WM_USER就行
函数体里面要根据消息进行相应处理,本例只有一种消息,那么可以省略判断了。
不知道讲明白没有,不对的地方大家指正
 
明白了,感谢!
 
以前我在论坛贴过,现在找不到了。。。。
 
接受答案了.
 
后退
顶部