1

我有一个带有数据的串口。我使用串口事件侦听器实现了与 RXTX 库的串口连接。因此,只要串行端口中有可用的传入数据,同步函数 serialEvent(SerialPortEvent oEvent) 就会运行。基本上,随着数据不断进入,程序将处于无限循环中。我将传入的数据组织成一个整数数组。现在我希望这个数组与我的其他类共享,这些类将使用这个数组来执行不同的任务。我可以说,由于串行事件侦听器在循环中运行并且数组不断变化,我希望所有其他类共享这个更改的数组数据。我之前学过一些关于 java.util.observables 的知识。当我在网上搜索时,我看到其他人使用 sychronized() 和 notify()/notifyAll() 在线程之间共享一个变量。

我不确定其中哪一个最好用?如果他们都在这种情况下工作,我需要注意的最重要的部分是什么?还有其他方法仍然可以实现我想要的吗?

4

3 回答 3

0

你的问题非常不清楚,但我可以给你一个一般性的建议。

使用串行端口对象的简单方法是打开输入或输出流,然后读取/写入字节。事件内容适用于您不希望线程阻塞等待读取数据的情况。

我建议您通读这些RXTX 示例,尤其是前两个说明基于流和事件的方法的示例。

如果这没有帮助,请使用一些 Java 代码或伪代码来更新问题,以解释您正在尝试做什么。

跟进

从您的“答案”来看,您似乎误解了什么synchronized。简单地说,它只是阻止两个线程同时执行某些代码区域。

您的问题还涉及一个线程以某种方式告诉另一个线程新数据已经到达并且需要处理。而且,您还遇到了必须在第一个线程用下一个数据块覆盖它之前处理数据的问题。

我建议您从阅读有关并发的 Java 教程流开始。这可能不会直接解决您的问题,但它应该让您开始以正确的方式思考问题。

于 2010-11-05T10:51:40.820 回答
0

如果没有有关您的应用程序的其他信息,这有点难以分辨。当您说“其他类”时,您的意思是“其他线程”吗?

如果您的其他类是线程并且您希望它们等待新数据,那么您可以拥有它们并在新数据可用时wait()拥有串行端口事件侦听器。notifyAll()这将唤醒正在等待的线程。但请注意,这只解决了通知:您仍然需要处理对数据数组的并发访问,因为新数据可能在其他线程正在访问它时到达。

另一方面,如果您使用Observable,那么当您调用 时Observable.notifyObservers(),这将导致调用update()each 的方法Observer,所有这些都在当前线程(正在调用的线程Observable.notifyObservers())的上下文中。如果您希望其他线程访问数据,您仍然需要某种方式来通知它们(例如,您的update()方法可能最终会实际调用notify())。

如果您提供有关您正在尝试做的事情的更多信息,我们可能会为您提供进一步的帮助。

于 2010-11-05T13:01:01.213 回答
0

很抱歉我的问题不清楚。我应该给出一些我正在使用的代码。请参考以下链接:

http://www.arduino.cc/playground/Interfacing/Java

基本上,这个示例代码与那些经典的 rxtx 示例不同,这些示例通过在某些函数上声明“同步”关键字在串行端口上进行基于事件的通信。我正在处理的唯一部分是在串行事件侦听器中:

public synchronized void serialEvent(SerialPortEvent oEvent) {

    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try {
            ////////////////////////////////////
            1) I will parse the incoming data into an integer array
            2) this array will be shared with other classes, let me
              explain some of them below.....
            ////////////////////////////////////
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }
}

功能A:一个使用这个共享数组中的数据做2D/3D图形的小程序。

功能 B:GUI 将从共享数组计算的一些数字输出/打印到 jframe 中的文本区域。它还可以通过按钮打开 Function A 小程序。但是 GUI 中有一些按钮会改变函数 A 中的一些变量,从而导致函数 A 处理共享数组的行为不同。

这就是我要的:

随着串行数据传入并解析到数据数组中......

1) 函数 B 将立即打印与此数据数组关联的数字。只有当用户点击按钮显示功能 A 小程序时,功能 A 才会显示 2D/3D 图形。

2) 当函数 A 和 B 都处于活动状态时,它们自己的变量会随着传入的串行数据而变化。

我希望函数 A 和 B 立即捕获共享数据数组中的更改,因为它在 serialEvent() 中发生更改。我知道最简单的方法是将数据数组作为引用传递,并在下一个传入数据可用之前调用每个函数。但是有Grodriguez之前提到的问题. 功能 A 或 B 正在进行时,可能会丢失一些传入数据。几年前我在 java 中做了一些关于 MVC 的事情,它使用不同类或 GUI 之间的 obervables 来显示温度。就像我在文本框中输入温度一样,带有滑块的另一个 GUI 将更改为输入温度。当我在此处更改滑块时,它将更改另一个 GUI 中的温度数字。连续事件让我想起了这里的这个应用程序。我不确定这是否是在这里应用的最佳方法,或者可能有其他更好、更简单的方法来完全按照我的意愿行事。

再次感谢您的耐心等待。

于 2010-11-06T00:07:53.743 回答