|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2019/1/7 21:04:45 |
标题: |
|
加入我的收藏 |
楼主: |
以前我一直用IDTELNET控件实现连接交换机之类的设备读取状态信息,但IDTELNET控件在网络不通时会造成程序阻塞,用了IdAntiFreeze有时感觉也没啥效果。 请问大家有没有用过其他方法实现类似功能(就是不要用IDTELNET的)?能否给我一个最简单的例子?只要知道怎么连接上设备,怎么发送命令,怎么接受返回数据就可以了,谢谢大家!
----------------------------------------------
- |
作者: |
|
2019/1/9 8:01:11 |
1楼: |
你可以了解下SNMP协议,连网络中的网络打印机都支持该协议
----------------------------------------------
-
|
作者: |
|
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 是一个匿名函数。你自己在里面随便写什么代码都可以,总之里面的代码是被线程执行的,而不是被主线程执行的。这样里面的代码阻塞了,也不会冻结你的程序界面。
----------------------------------------------
-
|
|