2012-06-15 69 views
0

我正在用C#编写一个程序,该程序与一个小型显示单元进行接口,该小型显示单元执行与此问题无关的大量内容。杀死等待答案的线程

我有如下详述的问题: 当用户选择一个按钮,将试图节省一些设置到该设备,它使用一个确认协议,以确保设置经历 (含义 - 它发送设置,然后等待来自设备的确认数据包。)

我所做的是在主应用程序中生成一个线程,该线程将成为我将要生成的线程的“父”线程,它将尝试保存到设备。目前,它的工作方式如下:

  • 生成线程1 - >尝试保存。

  • 如果超时,中断线程1(释放设备的数据锁)通过了Thread.interrupt()< -----这就是问题所在。这不起作用。它加粗锁定,直到设备关闭或拔出,然后出错。 (然后它会创建一个新的线程,现在发生,但它永远不会工作,因为第一个线程仍然锁定数据)。

  • 如果没有超时,线程1的回调让父线程知道不会再生成任何线程。

  • 最后,如果没有线程成功,则整体尝试失败。

我还试图只产生和关闭单个线程,这也显示出,其中等待来自设备的确认时,它永久地挂起,直到设备相同的行为这样被断电或拔出。

无法封装等待设备发送ack的布尔值,该布尔值可能被设置为停止线程,因为它从不离开等待的调用。这是嵌入式软件,所以我无法修改等待功能。我只能修改嵌入式软件的C#接口。

+0

您使用的是什么版本的.NET Framework? –

+0

我正在使用.NET 4.0 –

+0

我不完全清楚最后一点。调用一个函数来等待ACK,但是该函数存在并且在主机上运行,​​而不是在嵌入式系统上运行,那为什么它不能被修改?它是一个封闭源驱动程序吗?你也必须想知道为什么ACK从未收到过? – Clifford

回答

0

你应该使用Thread.Abort而不是Interrupt。 为了您的进一步澄清看看这个帖子 Abort Vs Interrupt

这应该可以解决您的问题。

+0

您不能从另一个线程调用中止来结束一个单独的线程。那么你可以,但它会放弃线程调用它(这将是主线程...) –

+0

那么在这种情况下,您应该为异步线程实现超时模式。看看这个http://stackoverflow.com/questions/710070/timeout-pattern-how-bad-is-thread-abort-really。这只是一个想法。我相信周围的事情可能会帮助你解决你的问题。 – Tabish

+0

不幸的是,这个线程试图为我获取数据(它响应一个布尔值)。该线程没有概述任何维护数据有效性的方法。如果我设置了布尔变量volatile,那么中止/挂起的线程似乎不会放开锁,但是如果我将它保留为非易失性,它有可能会损坏。 –

2

你似乎在说你的线程1会一直等待ACK。另一个线程检测超时条件并尝试中断线程1.我建议线程1不应该永远等待,而应该在等待ACK时超时。然后,线程1可以重试或退出并出现错误,并且不需要来自另一个线程的中断。

+0

我不确定你的意思。如果一个线程忙于等待某个函数调用它的运行完成,那么该线程本身不会执行时间。它被占领了。它必须在自身之外被中断,因为它已被占用。 –

+0

我认为@kkrambo建议您修改线程1,以便知道超时条件。这可能是通过对结果进行轮询等方式。没有看到有关您的线程如何锁定的更多细节,要提出具体建议有点困难。 –

+0

你的线程调用的函数不应该永远运行。它应该超时并返回一个错误。我想象你正在为一些通信端口调用Read()函数。当您调用Read()时,您应该能够指定超时。或者,也许你可以在打开通信端口时指定超时时间。或者,它可能不是一个通信端口,但像查询标志位一样简单。在这种情况下,你不应该永远投票。暂停后放弃。 – kkrambo