2011-02-26 2 views
2

관리 C++ 래퍼를 작성한 관리되지 않는 C++ 라이브러리가 있습니다. 지금은 C#에서 이것을 호출하려고합니다. 여태까지는 그런대로 잘됐다.C# 스레드에서 비 관리 코드 호출

표현 : 범위

중 벡터 첨자이도 가능 내가 관리되지 않는 코드 내에서 예외를 얻을 C#을 스레드에서 같은 코드를 호출하려고하지만 때? 각 스레드가 관리되지 않는 클래스의 자체 인스턴스를 가져올 것이라고 가정합니다.

스레드 내에서 관리되지 않는 코드를 호출하는 것에 대한 자세한 정보는 길고 열심히 찾았지만 정보는 부족한 것처럼 보입니다. 사전에 어떤 도움

감사

C++ 래퍼

// 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#을 스레드

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#을 스레드 .NET에서

Thread t1 = new Thread(DcThread); 
t1.Start(); 
+1

당신은 우리가 어떤을 만들기 위해 위해 C++/CLI 코드의 일부를 표시해야 할거야 (COM과 상호 작용을 위해 일반적으로 유용) STA에 아파트 상태를 설정할 수 있습니다 이 감각. –

+0

* EDIT * 예외는 하나 이상의 스레드가있을 때만 발생합니다. 그것의 스레드에서, 나는 다른 예외를 보지 못했습니다. –

+0

각 스레드에 대해 클래스의 별도 인스턴스를 명시 적으로 만들고 있습니까? 관리되는 래퍼 클래스 나 관리되지 않는 네이티브 클래스가 멀티 스레딩을 위해 설계되지 않았을 때이를 공유하는 것은 큰 일입니다. –

답변

1

관리 유형이 동일한에 따라 시작 규칙, 엄마 없음 C# 또는 C++/CLI로 작성되었는지 여부

각 스레드에 대해 C++/CLI 클래스의 새 인스턴스를 만들 수 있지만 원하는 컴파일러를 말하지 않으면 자동으로 실행되지 않습니다.

편집 : 코드를 살펴보면 메모리 누출과 관련된 문제는 발생하지 않습니다. 아마도 관리되지 않는 코드는 정적 또는 전역 변수를 사용하며, 따라서 여러 스레드에서 동시에 사용할 수 없습니다 -

가 충돌에 관해서는
!EllipseFit() 
{ 
    delete _unmanagedEllipseFit; 
    _unmanagedElipseFit = nullptr; 
} 


~EllipseFit() { this->!EllipseFit(); } 

다음 C++/CLI 클래스는 다음과 같이 소멸자와 파이널을 모두 가지고 있어야 .

+0

안녕하세요 Ben, 각 스레드에서 관리되는 래퍼의 인스턴스를 만듭니다. 난 왜 각 스레드가 자신의 인스턴스가 있다면 하나 이상의 스레드를 실행할 때 다른 행동을 볼 수 있을지 이해할 수 없다 .. –

+0

Ahh now .. 전역 변수 내 깊은 C++ 코드가 깊은 것 같다. 문제. 도와 주셔서 감사합니다! –

+1

@user : 아마도'using' 문을 사용하여 객체가 적시에 처리되도록 할 수 있습니다. –

-1

스레드를 만들 때 당신은

Thread thread = new Thread(); 
thread.SetApartmentState(ApartmentState.STA); 
thread.Start(new ThreadStart(DoWork)); 
+3

여기에는 COM이 없으며 순수한 C++ interop 만 있습니다. –