2014-10-08 9 views
0

이 문제는 다음과 유사합니다. How to copy a CImage object? CImage 개체의 전체 복사본을 만들어야합니다. 특정 문제는 PostMessage를 통해 보조 스레드에서 CImage *를 가져 와서 다른 클래스의 특성 인 CImage 개체에 복사하려고합니다.CImage 개체의 전체 복사본으로 인해 디버그 어설 션이 실패했습니다.

내가 현재 다음 코드가 있습니다

LRESULT CMainFrame::TransApplied(UINT wParam,LONG lParam) 
{ 
    DEB("message recieved\n"); //this is debug message to output 
    CImage *obrazek=(CImage*)wParam; 
    int a; 
    CString t; 
    CImage tymczas; 
    obrazek->Save(_T("mesydz.jpg"));//checking if the image is valid 
    DEB("o1\n"); 
    obrazek->GetDC(); 
PointerToViewClass->przetransformowany.Create(obrazek->GetWidth(),obrazek->GetHeight(),obrazek->GetBPP()); 
    DEB("o2\n"); 
    obrazek->BitBlt(PointerToViewClass->przetransformowany.GetDC(),0,0,SRCCOPY); 


// obrazek->ReleaseDC(); 
    DEB("o8\n"); 
    PointerToViewClass->przetransformowany.ReleaseDC(); 
    DEB("o6\n"); 

    DEB("o7\n"); 
    obrazek->ReleaseDC(); 
    //delete obrazek; 
    return 0; 
} 

내가 obrazek-에 문제>의 ​​GetDC()와 obrazek-> ReleaseDC()가있다 생각한다. Obrazek의 DC를 해제 할 수 없거나 obrazek 객체를 삭제할 수는 없지만 obrazek-> GetDC()를 사용하면 오류가 발생하지 않습니다 (그러나 obrazek-> BitBlt (...);에서 디버그 어설 션이 실패했습니다) 나는 그것을하고 싶지 않다면 나는 메모리 누출이 있기 때문에하고 싶다.

그래서 일반적으로 개체를 복사하는 것에 대해 알지 못하는 무언가가 있습니다.

EDIT :

CImage wyniczek; 
    CImage *doprzeslania; 

    objekt->ApplyTransform(macierz,&wyniczek);//object is an object of a class declared in dll 

    doprzeslania=new CImage(wyniczek); 

    PostMessage(data->parent,MY_WM_MESSAGE4,(WPARAM)doprzeslania,(LPARAM)3); 

delete objekt; 
FreeLibrary(hDLL); 
delete data;//deleting an object with settings for the thread 
return 0; 

추가적으로, 이미지와 DLL에 무슨 일 : 마지막

void IProcess::ApplyTransform(std::vector<double> matrix,CImage *rezult) 
{ 
// 
//some image processing here 
// 
output.Create(dest.cols,dest.rows,24); 
BITMAPINFO bmi; //it is initialized properly, had erased it for clarity 
StretchDIBits(output.GetDC(),0,0,dest.cols,dest.rows,0,0,dest.cols,dest.rows,temp.data,&bmi,DIB_RGB_COLORS,SRCCOPY); //copy from opencv Mat object to CImage 

rezult->Create(output.GetWidth(),output.GetHeight(),24); 

output.BitBlt(rezult->GetDC(),0,0,SRCCOPY); //copy to CImage *rezult 

output.ReleaseDC(); 
rezult->ReleaseDC(); 
} 
+1

메시지를받을 때 개체가 여전히 있는지 확인하십시오. 다른 스레드가이 CImage를 어떻게 해제합니까? – xMRi

+0

네, 꽤 확신합니다 - CImage가 성공적으로 디스크에 저장됩니다 (obrazek-> Save (_T ("mesydz.jpg"));) 그리고 완전히 유효한 이미지 인 것 같습니다. 다른 스레드에 관한 질문을 수정하고 더 많은 코드를 추가합니다. – user3621602

+0

또는 클래스와 스레드간에 이미지를 교환 할 수있는 대체 방법이 있습니까? – user3621602

답변

0

제가

다른 스레드는 다음과 같은 방법으로 C 화상 처리 여기에 잘못되어 가고있는 것을 생각해 냈습니다!

문제였다

이차 스레드 난 (스택 열렸다) 다른 C 화상 객체에 C 화상 오브젝트 복귀되었다 : 새로운 객체

CImage wyniczek; 
objekt->ApplyTransform(macierz,&wyniczek); 

하고 그것을 복사 복사 생성자 건설 힙 :

CImage *doprzeslania; 
doprzeslania=new CImage(wyniczek); 

그래서 일반적으로, *의 doprzeslania 객체가 보조 스레드 내가 제대로 기능의 시작에 저장 할 수 있었다 이상한 행동을 초래하는 실행되면서 동안 만 유효 PostMessage, bu 수신 다른 개체에 복사 할 수 없습니다. 이 솔루션은 기능에서 직접 *의 doprzeslania 객체로 이미지를 얻을 수 있었다 :

CImage *doprzeslania; 
doprzeslania=new CImage(); 
objekt->ApplyTransform(macierz,doprzeslania); 

지금 내가 화면에 이미지를 보여주는 문제가있다,하지만 난 또 다른 질문을 것 전에 내가 들여다해야합니다 그것은 나 자신에 의해 더 가깝다. 모두에게 감사드립니다!