等待活动

时间:2011-08-11 08:11:18

标签: java multithreading events blackberry

我正在尝试为Blackberry实现蓝牙功能类。但我被困在连接设备..

我做了一个简单的 MainScreen 连接,断开连接(现在)。蓝牙功能在另一个暗示BluetoothSerialPortListener 的类中得到了体现。

当我选择“connect”选项时,它会运行以下代码:

connect(BluetoothSerialPortInfo info){
    port = new BluetoothSerialPort(info, BluetoothSerialPort.BAUD_57600,....,this);

当连接协议完成时,函数deviceConnected(boolean success)由Blackberry执行,其中boolean具有连接结果(如果已连接则为true,否则为false)。我想在从connect(BluetoothSerialPortInfo info)方法返回之前检查此布尔值,因此我在wait(1000)中添加notify(),在deviceConnected(boolean success)中添加wait(1000)

问题是两个函数或方法都由同一个线程执行,当connect(info)完成时,超时完成,然后 deviceConnected 功能执行...

我尝试在一个单独的线程中运行 connect 方法,但它工作正常,但是我无法访问 MainScreen 对象以通知成功与否连接(即使我可以,我宁愿不这样做)。

我很想知道如何在单独的Thread中运行Listener方法,因此即使主线程忙,也可以执行它们。

提前致谢。

(我希望自己解释一下......)

修改 更多解释,如果我没有解释清楚:

问题是,我做connect(info),如果我尝试做Thread.sleep(10000),线程将睡10秒,然后调用deviceConnected方法,然后我能看到答案吗?我试图在运行deviceConnected的方法中做的Watever只是推迟了deviceConnected的执行。这就是为什么我会在另一个Thread中运行Listener方法(connect(info)作为例子),所以当我在方法public int BT_ConnectDevice(BluetoothSerialPortInfo info) { if (info==null) return(0x4F); try { _port = new BluetoothSerialPort(info, BluetoothSerialPort.BAUD_57600, BluetoothSerialPort.DATA_FORMAT_PARITY_NONE | BluetoothSerialPort.DATA_FORMAT_STOP_BITS_1 | BluetoothSerialPort.DATA_FORMAT_DATA_BITS_8, BluetoothSerialPort.FLOW_CONTROL_NONE, 1024, 1024, this); return(0); } catch(Exception e) { return(0x3F); } } 中等待答案时可以执行它....

编辑:代码:

连接方法:

public void deviceConnected(boolean success)
{
    this._bDeviceIsConnected=success;
}

监听器执行的方法:

synchronized(lock){
    try{
        lock.wait(10000);
    }
    catch(Exception e){}
    if (_bDeviceIsConnected) return (0);
}
return(0x3F);

我尝试添加 connect 方法,例如:

lock.notify()

当然,在deviceConnected中添加{{1}}。但只要我等待,就会从BT_ConnectDevice 返回后执行

2 个答案:

答案 0 :(得分:3)

我可以建议重新设想你的系统设计吗?为什么需要connect()方法阻塞?

我的建议是重新设计,以便调用connect()的代码理解它是一个非阻塞调用,然后让你的监听器在建立连接后启动必要的下一步。

您可以尝试类似这样的伪代码:

public void fieldChanged(Field f, int c) {
    if (f == myConnectButton) {
        connect(...);
    }
}

private class MyBluetoothConnectionListener ... {
    public void deviceConnected(boolean success) {
        if (success) {
            bluetoothConnectionEstablished();
        } else {
            bluetoothConnectionFailed();
        }
    }
}

private void bluetoothConnectionEstablished() {
    // TODO - put your logic here for what to do when the connection succeeds
}

private void bluetoothConnectionFailed() {
    // TODO - put your logic here for what to do when the connection fails
}

答案 1 :(得分:0)

你能不能在while循环中运行连接?

    while(!success){
    // try to connect
    }
希望它会在你超时之前继续尝试。

关于多线程here's a link,它将向您展示如何完成服务器端的教程。 记住在类上可运行的工具,并运行()每个线程来启动它。

希望这会有所帮助。