C# 关于串口的线程利用的一个问题

来源:百度知道 编辑:UC知道 时间:2024/07/01 00:06:38
我利用一个串口接收到的数据,控制某函数
eg:当接sp1接收到一个数据a,就让函数被调用,这个很简单,直接调用就行,但是但是我想在调用函数的同时(函数可一理解成一个运行时间比较长的函数,或者死循环),调用此函数的时候,接收到数据b让函数终止,或者改变函数内变量.这怎么解决?
如果直接调用函数,调用时是不可能接收到新的数据!
可能需要线程做,但是不清楚声明的线程是指运行的那段代码或过程?
或者可以写一个改变变量的时间,但那个新时间又属于那个线程?
对这些都很迷迷糊糊的,希望那位大侠能解释一下。。。
希望能给出实例。谢谢!

我的理解这是一个线程间通讯的问题,接收到a的时候主线程创建一个新的线程,运行的函数(比如叫WorkRun方法)在新线程(比如叫thA)中运行,当主线程接收到b时需要通知thA使他中止或改变其运行逻辑。
启动线程的写法:
Thread thA = new Thread(new ThreadStart(WorkRun));
thA.Start();
事实上,只有两种可能的场景,第一种是主线程向thA发送中止线程指令,让函数中止执行;另一种是函数在执行到某一个点的时候停下来等待主线程给他一个信号来决定该执行怎样的逻辑。
1. 如果是中止线程的话,只需要在接收到b的时候写
if(thA.ThreadState == ThreadState.Running)
{
thA.Abort();
}
2. 如果需要在运行中停下来等待主线程指令的话,使用ManualResetEvent,ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。

当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。

一旦它被终止,ManualResetEvent 将保持终止状态,直到它被手动重置。即对 WaitOne 的调用将立即返回。

可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。

ManualResetEvent 也可以同 staticWaitAll 和 WaitAny 方法一起使用。

以下为实例(下面的代码示例阐释了如何使用等待句柄来发送复杂数字计算的不同阶段的完成信号。计算的格式为:结果 = 第一项 + 第二项