消息,处理程序和线程:乐高头脑风暴蓝牙通信

时间:2012-08-09 12:24:33

标签: java android concurrency lego mindstorms

这个问题是指编写一个与lego mindstorms机器人上的NXT块通信的应用程序。

我想做什么

NXC(不完全是C,一种为NXT编写程序的语言)提供了一个函数until(condition),等待 condition 评估为true。我想使用蓝牙消息传递协议实现这一点,通过蓝牙从Android应用程序与NXT交谈。

到目前为止,我能做些什么:

我能够发送输入查询消息(getInputValue(int in)),该消息向NXT发送消息,询问中输入的当前状态。然后NXT发回一条带有此信息的消息,然后将该消息写入一个包含最近询问的输入值的全局变量(让我们称之为myValue)。

问题是什么:

我正在使用lego MINDroid应用程序中的一些零碎 - 在这个类中,我有一个独立的通信线程,可以处理与NXT的直接通信。收到消息后,它会通过Handler将其转发到主线程。当我尝试忙等待回复时出现问题 - 执行:

while(myValue != valueIWant) {
  sleep(100);
  getInputValue(in);
}

最终会占用主线程,因此处理程序实际上永远不会收到任何消息。通信线程接收来自NXT的消息,将它们转发到主线程,但处理程序永远不会被调用,因为它正在做其他事情。

解决这个问题的最佳方法是什么?我不能让线程以任何方式等待,因为这会阻止它接收消息:(

任何建议将不胜感激!我也很乐意详细说明任何代码。

可能有用的链接

http://bricxcc.sourceforge.net/nbc/nxcdoc/nxcapi/main.html

http://github.com/NXT/LEGO-MINDSTORMS-MINDdroid

http://mindstorms.lego.com/en-us/support/files/default.aspx(对于蓝牙文档)

1 个答案:

答案 0 :(得分:1)

使用回调解决了:)如果需要,请尽快详细说明。

编辑:(对不起,迟到的回复!)

我最终实施了一个回调程序,我在其中附加了一个'回调'功能到一些列表。当处理程序收到消息时,它会查看回调列表并查看收到的消息是否与存在的任何回调函数匹配 - 如果是,它将执行回调内的方法。

然后我围绕这些回调创建了一个类,在那里我可以创建执行队列(doA; doB; doC;)并将它们包装到回调链中(callBack({doA; callBack({doB; call .. 。})})),这给人的印象是我在同步环境中操作,而实际上它是异步操作。