J'ai une bibliothèque C++ non managée pour laquelle j'ai créé un wrapper C++ géré. J'essaye maintenant d'appeler ceci de C#. Jusqu'ici tout va bien. Cependant, lorsque je tente d'appeler le même code à l'intérieur dans un thread C# Je reçois des exceptions à partir du code non managé:Appel de code non géré à partir d'un thread C#
expression: vecteur Indice hors de portée
Est-ce même possible? Je suppose que chaque thread obtiendrait sa propre instance de la classe non managée?
J'ai cherché longtemps et dur pour plus d'informations sur l'appel de code non géré à partir de threads, mais l'information semble sparce pour le moins.
Merci à l'avance pour toute aide
C++ Wrapper
// Managed wrapper
public ref class EllipseFit
{
private:
// Pointer to unmanaged class
UnmanagedEllipseFit* _unmanagedEllipseFit;
public:
// Constructor & Destructor
EllipseFit()
{
_unmanagedEllipseFit = new UnmanagedEllipseFit();
}
~EllipseFit()
{
delete _unmanagedEllipseFit;
}
List<Ellipse^>^ ProcessImage(array<Byte>^ image, int width, int height)
{
pin_ptr<unsigned char> pimg = &image[0];
_unmanagedEllipseFit->processsImage(pimg, width, height);
// Marshal the results... <edited>
return ellipses;
}
};
C# Discussion
private void DcThread()
{
EllipseFit ellipseFit = new EllipseFit();
string fullPath = _fileList.GetNext();
while (fullPath != null)
{
// Load the image
Bitmap bitmap = new Bitmap(fullPath);
byte[] imageData = TsImage.ConvertBitmap(bitmap);
// Process
List<DcEllipse> ellipses = ellipseFit.ProcessImage(imageData, bitmap.Width, bitmap.Height);
// Save the associated text file.. (Debug)
TextWriter textFile = new StreamWriter(fullPath.Replace(".jpg", ".txt"));
foreach (DcEllipse ellipse in ellipses)
textFile.WriteLine(String.Format("{0} {1} {2} {3} {4}", ellipse.X, ellipse.Y, ellipse.MajorAxisLength, ellipse.MinorAxisLength, ellipse.Angle));
textFile.Close();
fullPath = _fileList.GetNext();
}
}
C# Discussion Début
Thread t1 = new Thread(DcThread);
t1.Start();
Vous allez devoir montrer une partie du code C++/CLI pour nous de faire QUELQUE sens de ceci. –
* EDIT * Les exceptions ne se produisent que lorsque j'ai plus d'un thread. Dans un fil de lui-même sans autres threads, je ne vois aucune exception. –
Créez-vous explicitement des instances séparées de la classe pour chaque thread? Le partage de la classe wrapper managée ou de la classe native non managée lorsqu'ils ne sont pas conçus pour le multithreading est un gros non-non. –