2017-07-31 49 views
0

我有一個活性(與ISurfaceTextureListener):C#的Android - ISurfaceTextureListener線程中斷,然後用在我稱之爲異步SendPixel方法異步OnSurfaceTextureUpdated方法恢復時,活動關閉

public async void OnSurfaceTextureUpdated(SurfaceTexture surface) 
{ 
    bool sendPixel = false; 

    [...] 

    if (Settings.Pixel.period >= 0) 
    { 
     if (stopWatch.ElapsedMilliseconds >= Settings.Pixel.nextSending) 
     { 
      if (Settings.Pixel.period > 0) 
       Settings.Pixel.nextSending += Settings.Pixel.period * ((int)((stopWatch.ElapsedMilliseconds - Settings.Pixel.nextSending)/Settings.Pixel.period) + 1); 
      sendPixel = true; 
     } 
    } 

    [...] 

    if (sendPixel) 
     await SendPixel(); 
} 

這裏是異步SendPixel方法:

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」。

編輯:EV3Messaging.SendMessages發送消息(藍牙)在前面的代碼加入:

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

爲什麼這種情況發生,我怎麼能解決?

在此先感謝。

PS:對不起,我的英文不好^^

+0

沒有代碼的'Ev3Messaging.SendMessages'無法確定原因。 – Gusman

+0

哎呀,對不起,我要添加它。 –

+0

好吧,似乎藍牙流不工作,當你關閉套接字時關閉應用程序,所有的操作結束。您是否在連接的設備上收到消息? – Gusman

回答

1

解決:我忘了清除btMessage列表每次發送數據時,那麼這將導致這種奇怪的行爲。這個問題也可能是因爲用於從藍牙設備接收數據的錯誤方式。

然後SendMessages方法變爲:

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

每個I添加消息的時間,因爲,新的幀是在btMessage列表結束時加入。

此外,獲得傳入的消息,我用這個代碼:

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); 
}