小弟现在正在写一个计费系统,现在的设计是写两个线程类。一个用于从端口中读数据然后写在一个公共区域中;另一个用于从这个公共区域中读数据。 程序开始时构造一个写线程,8个读线程。使用两个mutex,一个在读线程的Execute函数中用于限制8个读线程中同时只有一个进入公共区域,另一个在公共区域中用于保证写线程和唯一的读线程中只有一个对公共数据进行操作。代码如下: procedure TReadCommThread.Execute;//读取端口线程 begin while True do begin FlagReadCommT:=CommReceive(Input,countInput);//从端口读取数据 if FlagReadCommT=0 then //读取成功 Deal12(Input,countInput) //区分消息内容的函数 else Application.ProcessMessages; end;//end while... end;
procedure TReadCommThread.Deal12; var CardNo:BYTE; LineNo:BYTE; StateChange:BYTE; StateID:BYTE; StateContent:BYTE; Flag:Integer; begin CardNo:=Input^; LineNo:=Input^; StateChange:=Input^; StateID:=Trunc(StateChange/16); StateContent:=(StateChange and 15); while true do begin //向公共区写数据 Flag:=DataModule3.OperateCritical(LineNo,CardNo,StateID,StateContent, WRITE_CRITICAL); if Flag=0 then break //写入成功 else sleep(100); end; end; procedure TLineThread.Execute; //读取公共区域的线程 begin while true do begin if waitforsingleobject(hmutex2,infinite)=wait_object_0 then //建立互斥 begin //读取公共区中的数据 FlagLineT:=DataModule3.OperateCritical(LineNo,CardNo,StateID, StateContent,READ_CRITICAL); if FlagLineT=0 then begin .... end; end; //end mutex releasemutex(hmutex2); Application.ProcessMessages; end; //end while end;
function TDataModule3.OperateCritical(Line:BYTE;Card:BYTE;var SID: BYTE;var SC:BYTE;Flag:Integer):Integer; var i:Integer; Node:TNode; Temp:TNode; Tour:TNode; begin if waitforsingleobject(hmutex1,infinite)=wait_object_0 then //互斥 begin if Flag=WRITE_CRITICAL then begin Node:=TNode.Create(Line,Card,SID,SC); if InfoString.Rear=nil then //链表中没有数据 begin with InfoString do begin Rear:=Node; Head:=Node; end; end else //有数据 ....... 现在的问题是在一个写线程和8个读线程启动后,在两类线程在各自的函数中同时调用 OperateCritical时,只有读线程可以执行,写线程不能进入公共区对共有变量进行写入。 也就是在ReadCommThread的Execute中调用的Deal12中执行到Flag:=DataModule3.OperateCritical时就不能进行下去了,无法从端口再读数据了,小弟认为ReadCommThread根本没有进入OperateCritical,我又试了临界区,但同样无法解决! 求大家帮我解决啊,我急用!!谢谢!