DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: webb123
今日帖子: 3
在线用户: 5
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 caiyang123456 (cy) ▲▲▲△△ -
普通会员
2019/1/7 21:04:45
标题:
请教大家一个问题 浏览:1224
加入我的收藏
楼主: 以前我一直用IDTELNET控件实现连接交换机之类的设备读取状态信息,但IDTELNET控件在网络不通时会造成程序阻塞,用了IdAntiFreeze有时感觉也没啥效果。
请问大家有没有用过其他方法实现类似功能(就是不要用IDTELNET的)?能否给我一个最简单的例子?只要知道怎么连接上设备,怎么发送命令,怎么接受返回数据就可以了,谢谢大家!
----------------------------------------------
-
作者:
男 kenliaoliao (ben) ★☆☆☆☆ -
普通会员
2019/1/9 8:01:11
1楼: 你可以了解下SNMP协议,连网络中的网络打印机都支持该协议
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/10/22 16:25:46
5楼: 楼主,Indy 的控件都是阻塞式。不单单是网络不通会阻塞程序,网络慢或者对方反应慢,也会阻塞程序。总之就是网络操作完成才会继续往下执行。平常你没感觉到阻塞是因为它阻塞时间太短。

阻塞式的好处是编程同步,代码一行一行往下走有上下文关心,不会来回到处乱跳。

阻塞式的网络通讯编程,如果你不想让程序冻结,那就不要用主线程去调用它。简单说,就是把调用它的方法,写到一个线程里面去,这样就不会冻结主线程了。

传统的写法,你要创建一个你自己的线程类,比如:

TMyThread = class(TThread)
protected
  procedure Execute;override;
public
end;

然后你在 execute 里面去写调用你的 Indy 控件的代码。

这样写比较麻烦,需要输入的代码比较多。新版的 Delphi 提供了语法糖,可以这样来写,看起来语句不同,但原理是一样的:

TTask.Run(
  procedure
  begin
     //这里是调用你的 Indy 控件的代码。
  end
);

上面那个 TTask.Run 里面的 procedure 是一个匿名函数。你自己在里面随便写什么代码都可以,总之里面的代码是被线程执行的,而不是被主线程执行的。这样里面的代码阻塞了,也不会冻结你的程序界面。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行64.45313毫秒 RSS