2017-07-31 7 views
0

を閉じたときに、私は非同期SendPixelメソッドを呼び出している非同期OnSurfaceTextureUpdated方法で(ISurfaceTextureListener有する)活性を有する再開次いで中断しました:C#のアンドロイドISurfaceTextureListenerスレッドは活性が

async Task SendPixel() 
{ 
    try 
    { 
     if (Ev3Messaging.IsConnected()) 
     { 
      Color color = new Color(bm.GetPixel(Settings.Camera.viewport.X_VpToCv(Settings.Pixel.x), Settings.Camera.viewport.X_VpToCv(Settings.Pixel.y))); 
      Ev3Messaging.AddNumberMessage("MC_Hue", color.GetHue()); 
      Ev3Messaging.AddNumberMessage("MC_Brightness", color.GetBrightness()); 
      Console.WriteLine("SendPixel"); 
      await Ev3Messaging.SendMessages(); 
      Console.WriteLine("SendPixelEnd"); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Error SendPixel: " + ex.Message); 
    } 
} 

ISurfaceTextureListenerはビデオストリームを読み取り、SendPixelメソッドが何度も呼び出されます。 問題は、コンソールが「SendPixel」を表示しても、「SendPixelEnd」を表示しないため、エラーがスローされないということです。 その後、アクティビティを閉じると、見つからない「SendPixelEnd」がすべて表示されます。

EDIT:

static List<byte> btMessage = new List<byte>(); 
static public async Task SendMessages() 
{ 
    if (_socket != null) 
     await _socket.OutputStream.WriteAsync(btMessage.ToArray(), 0, btMessage.Count); 
} 

なぜそれが起こるんし、どのように私はそれを解決することができます:EV3Messaging.SendMessagesは(ブルートゥースによる)メッセージを送信しますが、前の行に追加しましたか?

ありがとうございます。

PS:私の下手な英語^^解決しよう

+0

はまた、受信メッセージを取得するために、私はこのコードを使用します。 – Gusman

+0

おっと、申し訳ありません、私はそれを追加します。 –

+0

さて、それは、Bluetoothのストリームが動作していないと思われ、ソケットが閉じられたときにアプリケーションを閉じると、すべての操作が終了します。接続されたデバイスでメッセージを受信して​​いますか? – Gusman

答えて

1

のため申し訳ありませんが:私はbtMessageリストに私がデータを送信するたびにクリアするために忘れてしまった、これはこの奇妙な動作が発生します。この問題は、Bluetoothデバイスからデータを受信するのに悪い方法が使用されたことも原因です。

そしてSendMessages方法は次のようになる。

static public async Task SendMessages() 
{ 
    if (_socket != null) 
     await _socket.OutputStream.WriteAsync(btMessage.ToArray(), 0, btMessage.Count); 
    btMessage.Clear(); 
} 

Iメッセージを追加するたびので、新たなフレームがbtMessageリストの最後に追加されます。 `Ev3Messaging.SendMessages`は原因を特定することはできません上のコードがなければ

public static void InputMessagesManager(Action<BtMessage> incomingMessageEvent) 
{ 
    _tokenSource = new CancellationTokenSource(); 
    Task t = Task.Factory.StartNew(async() => 
    { 
     Stream inputStream = _socket.InputStream; 

     while (!_tokenSource.IsCancellationRequested) 
     { 
      if (inputStream == null) 
       inputStream = _socket.InputStream; 
      if (inputStream != null && inputStream.CanRead) 
      { 
       await inputStream.ReadAsync(_sizeBuffer, 0, _sizeBuffer.Length); 

       short size = (short)(_sizeBuffer[0] | _sizeBuffer[1] << 8); 
       if (size != 0) 
       { 
        byte[] frame = new byte[size]; 
        await inputStream.ReadAsync(frame, 0, frame.Length); 
        BtMessage btMes = new BtMessage(frame); 
        incomingMessageEvent(btMes); 
        Console.WriteLine("Received: " + btMes.name + " -> " + btMes.getValueAsNumber()); 
       } 
      } 
     } 
    }, _tokenSource2.Token, TaskCreationOptions.LongRunning, TaskScheduler.Current); 
} 
関連する問題