2017-02-11 45 views
-1

我需要每两秒重复发送4个字节,即00 00 00 F6
但是,IdUDPClient.SendBuffer传输后没有返回。为什么对IdUDPClient.SendBuffer的调用不总是返回?

我尝试发送几个字节,并且每次都返回。

这工作:

UDP.SendBuffer(RawToBytes(#0 + #0 + #0 + #1 + #127 + #128 + #246, 7)); 

这不起作用:

UDP.SendBuffer(RawToBytes(#0 + #0 + #0 + #246, 4)); 

我已经失败尝试了许多的我已经在各种相关StackExchange发现问题的建议。

我看到至少三种情形:

  1. 悬挂,Wireshark的看到1个传输。
  2. 工作重复传输,但不包含4个字节的数据。
  3. 有时字节>7F3F发送。

有人能指出我做错了什么吗?

编辑:上面发生在一个线程中。如果TIdUDPClient被放置为表单上的可见组件,那么它工作正常。

这可能是一个线程/重入问题?

+0

请提供一个[最小,完整和可验证示例](/ help/mvce)来演示问题。此外,您正在滥用'RawToBytes()'。使用'Send()'而不是'SendBuffer()'。或者使用'IdGlobal。ToBytes()'。或者手动构建一个TIdBytes变量。 –

+0

@Remy Lebeau我做了一个MCV向你展示,并且工作。感谢推动我清理。一定是线程问题。回到绘图板。 – AndersJ

+0

@Remy Lebeau TidBytes变量的SetLength很容易忘记:-( – AndersJ

回答

0

这无疑将有助于看到更多的代码,有你确信你的线程实际运行使用TIdUDPClient时(调用execute),否则你的代码不需额外来看,显然:)

的区别可见表格组件是,它自动创建(构造函数是由德尔福设计师自动运行)

TIdUDPClient.Create(AOwner: **) 

这样做的组件将在主线程上运行(“GUI线程”如果你喜欢)

几t hings我倒是建议你为了追捕下来要做的是:

首先确保线程实际执行

的问题也可能是,如果实例化TIdUDPClient的TIdUDPClient不具有所有者。创建(无)线内,尝试实例INT与和业主无论是TThread类或应用程序

TIdUDPClient.Create(Self) 

TIdUDPClient.Create(Application) 

希望这会有所帮助,但正如我所说的发布更多的代码肯定会使我可以帮助你!

相关问题