В ожидании события - PullRequest
       3

В ожидании события

1 голос
/ 11 августа 2011

Я пытаюсь реализовать функциональный класс Bluetooth для Blackberry.Но я застрял в подключении устройства ..

Я сделал простой MainScreen , который подключается, отключается (пока).Функциональность Bluetooth реализована в другом классе, который внедряет BluetoothSerialPortListener .

Когда я выбираю опцию «connect», он запускает следующий код:

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

Когда протокол соединения завершается, Blackberry выполняет функцию deviceConnected(boolean success) с boolean имеет результат соединения (true, если он подключен, и false, если нет).Я хотел проверить это логическое значение перед возвратом из метода connect(BluetoothSerialPortInfo info), поэтому я поместил в него wait(1000) и notify() в deviceConnected(boolean success).

Проблема заключается в том, что обе функции или методы выполняются одним и тем же потоком, и когда создается wait(1000), время ожидания заканчивается, а затем deviceConnected функция выполнена ...

Я попытался запустить метод connect в отдельном потоке, и он сработал, но затем я не смог получить доступ к MainScreen объекты, чтобы уведомить об успехе или нет соединения (и даже если бы я мог, я бы предпочел не делать этого).

Мне бы очень хотелось узнать, как запускать методы Listener в отдельном потоке, чтобы они могли выполняться, даже если основной поток занят.

Заранее спасибо.

(Надеюсь, я объяснил себе ...)

РЕДАКТИРОВАТЬ Дополнительные пояснения, если я не объяснил это хорошо:

Дело в том, что я делаю connect(info), и если я попытаюсь сделать, например, Thread.sleep (10000), поток будет спать 10 секунд, и после этого вызывается метод deviceConnected, и тогда я могу увидеть ответ.Что бы я ни пытался сделать в методе, который запускает connect(info), просто отложите выполнение deviceConnected.Вот почему я запускаю методы Listener (deviceConnected в качестве примера) в другом потоке, чтобы он мог выполняться, пока я жду ответа в методе 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;
}

Я пытался добавить в connect метод что-то вроде:

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

И, конечно, добавьте lock.notify() в deviceConnected.Но пока я жду, deviceConnected выполняется после возврата из BT_ConnectDevice.

Ответы [ 2 ]

3 голосов
/ 11 августа 2011

Могу ли я предложить переосмысление вашей системы? Зачем нужен метод 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
}
0 голосов
/ 11 августа 2011

не могли бы вы просто запустить соединение в цикле while?

    while(!success){
    // try to connect
    }

надеюсь, оно продолжит попытки до истечения времени ожидания.

в отношении многопоточности вот ссылка , которая покажет вам учебник о том, как это делается на стороне сервера.Помните, что реализуемые объекты выполняются в классе и запускают () каждый поток для его запуска.

надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...