by Anonymous » 29 Dec 2024, 12:10
Ich verwende das Kinect SDK in einer WPF-Anwendung und warte auf das Ereignis DepthFrameReady, um einige Vorgänge auszuführen. Um eine Blockierung der Benutzeroberfläche zu vermeiden, habe ich das Ereignis asynchron gemacht und „warte“ auf die Funktion, die die Datenoperationen durchgeführt hat.
Im Moment im Ausgabefenster in Visual Studio, ich erhalte die Meldung:
WARNUNG: Eine imageFrame-Instanz wurde nicht entsorgt
Ich habe viele Dinge versucht, um den DepthImageFrame zu entsorgen (Put-Logik). innen mit Block, Rückruf, wenn die asynchrone Funktion endet usw.), aber nach dem ersten Aufruf wird Null gesendet, also...
Das ist die richtige Art der Entsorgung das Objekt in async/await Ereignissen?
:
Code: Select all
private async void KinectSensorFound_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
{
// as suggested in Zoran Answer
await Task.Run(() =>
{
using (DepthImageFrame DataDepthImageFrame = e.OpenDepthImageFrame())
{
UpdateUserDepthInfo(DataDepthImageFrame);
}
});
}
public void UpdateUserDepthInfo(DepthImageFrame DataDepthImage)
{
var TimeNow = DateTime.Now;
if ((DateTime.Now - PreviusTime).Milliseconds
{
if (chckbxDepthImage.IsChecked == true)
{
chckbxColorImage.IsChecked = false;
// This method is called in my business logic to do a transformation with the frame
BitmapSource DepthBitMapSource = Controller.getInfoOfDepthUser(DataDepthImage);
DepthCanvas.Background = new ImageBrush(DepthBitMapSource);
}
else
{
DepthCanvas.Children.Clear();
DepthCanvas.Background = new SolidColorBrush(Colors.Transparent);
}
DepthUserInfo = Controller.DoGetInfoDepthUser(DataDepthImage);
lblDepthUser.Content = string.Format("{0:0.00} mts", DepthUserInfo / 1000);
}), DataDepthImage);
PreviousTime = TimeNow;
}
:
Code: Select all
public BitmapSource getBitmapOfDepth(DepthImageFrame DataImageFrame)
{
DepthImagePixel[] ImageDepth = new DepthImagePixel[0];
int DepthDistance;
depthReturnStruct DepthReturn = new depthReturnStruct();
if (DataImageFrame != null)
{
ImageDepth = new DepthImagePixel[DataImageFrame.PixelDataLength];
DataImageFrame.CopyDepthImagePixelDataTo(ImageDepth); // exception here
//... other code
}
return bitmapDepth;
}
Ich verwende das Kinect SDK in einer WPF-Anwendung und warte auf das Ereignis DepthFrameReady, um einige Vorgänge auszuführen. Um eine Blockierung der Benutzeroberfläche zu vermeiden, habe ich das Ereignis asynchron gemacht und „warte“ auf die Funktion, die die Datenoperationen durchgeführt hat.
Im Moment im Ausgabefenster in Visual Studio, ich erhalte die Meldung:
WARNUNG: Eine imageFrame-Instanz wurde nicht entsorgt
Ich habe viele Dinge versucht, um den DepthImageFrame zu entsorgen (Put-Logik). innen mit Block, Rückruf, wenn die asynchrone Funktion endet usw.), aber nach dem ersten Aufruf wird Null gesendet, also...
Das ist die richtige Art der Entsorgung das Objekt in async/await Ereignissen?
[code]MyWindow.xaml.cs[/code]:
[code]private async void KinectSensorFound_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
{
// as suggested in Zoran Answer
await Task.Run(() =>
{
using (DepthImageFrame DataDepthImageFrame = e.OpenDepthImageFrame())
{
UpdateUserDepthInfo(DataDepthImageFrame);
}
});
}
public void UpdateUserDepthInfo(DepthImageFrame DataDepthImage)
{
var TimeNow = DateTime.Now;
if ((DateTime.Now - PreviusTime).Milliseconds
{
if (chckbxDepthImage.IsChecked == true)
{
chckbxColorImage.IsChecked = false;
// This method is called in my business logic to do a transformation with the frame
BitmapSource DepthBitMapSource = Controller.getInfoOfDepthUser(DataDepthImage);
DepthCanvas.Background = new ImageBrush(DepthBitMapSource);
}
else
{
DepthCanvas.Children.Clear();
DepthCanvas.Background = new SolidColorBrush(Colors.Transparent);
}
DepthUserInfo = Controller.DoGetInfoDepthUser(DataDepthImage);
lblDepthUser.Content = string.Format("{0:0.00} mts", DepthUserInfo / 1000);
}), DataDepthImage);
PreviousTime = TimeNow;
}
[/code]
[code]KinectHelper.cs[/code]:
[code]public BitmapSource getBitmapOfDepth(DepthImageFrame DataImageFrame)
{
DepthImagePixel[] ImageDepth = new DepthImagePixel[0];
int DepthDistance;
depthReturnStruct DepthReturn = new depthReturnStruct();
if (DataImageFrame != null)
{
ImageDepth = new DepthImagePixel[DataImageFrame.PixelDataLength];
DataImageFrame.CopyDepthImagePixelDataTo(ImageDepth); // exception here
//... other code
}
return bitmapDepth;
}
[/code]