首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 关于DLL中TComPort控件的事件响应问题 [已结贴,结贴人:huanghuang612]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 14:45:20 楼主

    在写带Form(含TComPort控件)的DLL中有个接口函数的功能如下:在串口的发送缓存中写入字符串后,等待一段时间后,判断某一参数是否已经改变,其中该参数在串口的接收函数ComPort1RxChar(Sender: TObject; Count: Integer);中处理。

    DLL中的代码如下:

    procedure SynAPP(App:THandle );stdcall;
    begin
      Application.Initialize;
      Application.Handle := App;
    end;


    procedure ShowForm;stdcall;
    begin
      try
        frmDLL := TfrmDLL.Create (Application);
        frmDLL.ShowModal = idOk ;
      except
        on E: Exception do
          MessageDlg ('Error in DLLForm: ' +
            E.Message, mtError, [mbOK], 0);
      end;
    end;

    procedure TFrmDll.ComPort1RxChar(Sender: TObject; Count: Integer);
    var ss:string;
    begin
      ComPort1.ReadStr(ss,Count);
      Edit1.Text:='RxChar';
      flag:=true;
    end;

    function TFrmDll.IntFuction:boolean;
    begin
      Result:=false;
      flag:=false;
      ComPort1.WriteStr('asdfgh');
      Repeat
        Application.ProcessMessages;  //////////////////////////////////////
      until flag=true;
      Edit1.Text:='已经反馈lllll';
      Result:=true;
    end;

    procedure TFrmDll.Button2Click(Sender: TObject);
    begin
      IntFuction;
    end;

    在调用该DLL的exe主程序中调用函数
      SynAPP(Application.Handle);
      ShowForm ;
    将句柄传给DLL中的窗体。

    出现的问题是:点击DLL中的Button2后,ComPort1接收到字符后不会调用ComPort1RxChar函数,也就是说
    Application.ProcessMessages;  //////////////////////////////////////这句代码不接受ComPort1RxChar的响应,但能响应DLL中其它Button的Click消息。
    若去掉IntFuction函数中的Repeat循环体,则ComPort1接收到字符后能正常响应ComPort1RxChar函数。
    请问为什么,谁能分析?
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 09:24:131楼 得分:20
    Repeat
        Application.ProcessMessages;  //////////////////////////////////////
      until flag=true;

    上面代码的延时功能在哪儿?
    如果FLAG一直是FALSE,那么这段代码就会一直占用处理器,运行下去;
    虽然有一个句转让控制权的语句,但对于一个循环体来说,其功能恐怕是有限的了;
    COMPORT是线程来完成COM操作与接收的;你这个"简单"的循环体,占用处理器了.
    因此这个延时功能属于一个设计不合理的功能;


    也可以这样完成延时:

    //uses windows;

    function TFrmDll.IntFuction:boolean;
    var
      passtime:cardinal;
    begin
      Result:=false;
      flag:=false;
      ComPort1.WriteStr('asdfgh');
      passtime:=gettickcount; 
      Repeat
        Application.ProcessMessages;  //////////////////////////////////////
      //until flag=true;
      until gettickcount-passtime>1000;//在这儿最多延时一秒;
      if flag then//换成这样试试吧,我没有调试,你自己再试试;
      begin
        Edit1.Text:='已经反馈lllll';
        Result:=true;
      end;
    end;


    另外:你完全可以把你显示的功能放在接收数据的事件里来完成;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 10:19:172楼 得分:0
    我的问题是在repeat循环时,当串口接收到数据,Application.ProcessMessages这句代码不会去响应串口接收事件。而必须时循环体结束时才能响应接收事件。即使使用你说的延时一秒,它也只会在结束循环后才去响应,这样循环体内代码Application.ProcessMessages没响应接收事件。
    理论上即使一直处于循环中,Application.ProcessMessages也该能响应我的串口接收事件。但循环体中的Application.ProcessMessages能响应界面上的其它button事件。所以我不清楚的是同一句代码为什么能响应其它事件而不能串口接收事件,难道TComPort有什么特殊之处?
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved