DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: eyang11
今日帖子: 1
在线用户: 4
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 compower (compower) ★☆☆☆☆ -
普通会员
2004/3/2 20:33:21
标题:
有关线程互斥,各位高手帮忙看一下! 浏览:1309
加入我的收藏
楼主: 小弟现在正在写一个计费系统,现在的设计是写两个线程类。一个用于从端口中读数据然后写在一个公共区域中;另一个用于从这个公共区域中读数据。
程序开始时构造一个写线程,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,我又试了临界区,但同样无法解决!
求大家帮我解决啊,我急用!!谢谢!

----------------------------------------------
-
作者:
男 restboy (枫☆白水煮大虾) ★☆☆☆☆ -
盒子活跃会员
2004/3/3 2:38:13
1楼: 偶不会,只好帮你顶一下了^^
----------------------------------------------
夫君子之行,静以修身,俭以养德.非澹泊无以明志, 
非宁静无以致远.夫学须静也,才须学也,非学无以广才,
非志无以成学,淫漫则不能励精,险躁则不能治性,年与时驰, 
意与日去,遂成枯落,多不接世,悲守穷庐,将复何及!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行66.40625毫秒 RSS