2016-03-25 15 views
0

Bir görüntüyü görüntülemek için iş parçacığı kullanmak istiyorum, ancak denediğimde aşağıdakileri elde ederim: error : a nonstatic member reference must be relative to a specific object.OpenCV ve MFC ile görüntüyü işlemek için bir iş parçacığı nasıl kullanılır

hata aşağıdaki satırda oluşur:

ShowImage(Image1, IDC_ShowImg); 

Herkes bana bu sorunu çözmeye yardımcı olabilir misiniz? Teşekkürler. İşte

benim kodudur:

.h dosyası

class MFC_DMA : public CDialog 
{ 
public: 
    MFC_DMA(CWnd* pParent = NULL); // standard constructor 
    virtual ~MFC_DMA(); 
    // Dialog Data 
    enum { IDD = IDD_MFC_DMA }; 
private: 
    CWinThread *worker_thread_; 

protected: 
    HICON m_hIcon; 
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 
    virtual BOOL OnInitDialog(); 
    DECLARE_MESSAGE_MAP(); 

public: 
    afx_msg void OnBnClickedCancel(); 
    afx_msg void OnBnClickedOk(); 
    void ShowImage(IplImage * img, UINT ID);//imaging 
    afx_msg void OnBnClickedButtonstart();//Start thread 
    afx_msg void OnStnClickedShowimg2();//Picture control 
    afx_msg void OnStnClickedShowimg();//Picture control 
    static UINT MyThreadButton2(LPVOID LParam);//thread 
}; 

.cpp dosyasını

void MFC_DMA::ShowImage(IplImage* img, UINT ID) 
{ 
    CDC* pDC = GetDlgItem(ID)->GetDC(); 
    HDC hDC = pDC->GetSafeHdc(); 
    CRect rect; 
    GetDlgItem(ID)->GetClientRect(&rect); 
    int rw = rect.right - rect.left; 
    int rh = rect.bottom - rect.top; 
    int iw = img->width; 
    int ih = img->height; 
    int tx = (int)(rw - iw)/2; 
    int ty = (int)(rh - ih)/2; 
    SetRect(rect, 0, 0, 512, 512); 
    CvvImage cimg; 
    cimg.CopyOf(img); 
    cimg.DrawToHDC(hDC, &rect); 
    ReleaseDC(pDC); 
} 

    //Structure Thread2 
    struct MyThreadInfo2 
    { 
     HWND hWnd; 
    } 
    Info2;// Global Variables 
    BOOL Start_Stop = NULL; 
    //Thread code 
    UINT MFC_DMA::MyThreadButton2(LPVOID LParam) 
    { 
     const int nSize2 = 32768;//I used PCI-e to receive data. 
     const int width = 512; 
     const int height = 512; 
     const int channels = 1; 
     const int step = 512 * 2; 
     CvSize img_size = cvSize(width, height); 
     unsigned char *data = new unsigned char[nSize2]; 
     unsigned char *data2 = new unsigned char[nSize2]; 
     unsigned char *data_all = new unsigned char[nSize2 * 16]; 
     unsigned char *data_all2 = new unsigned char[nSize2 * 16]; 
     Image1 = cvCreateImageHeader(img_size, IPL_DEPTH_16U, channels);   
     Image2 = cvCreateImageHeader(img_size, IPL_DEPTH_16U, channels); 
     cvCreateData(Image1); 
     cvCreateData(Image2); 
        
    while (Start_Stop) 
     { 
      MyThreadInfo2 *pInfo2 = (MyThreadInfo2*)LParam; 
      MFC_DMA *hWnd = (MFC_DMA*)CWnd::FromHandle(pInfo2->hWnd); 
      for (int i = 0; i < 16; i++) 
      { 
       { 
        for (int j = 0; j < nSize2; j++) 
         { 
          data_all[nSize2*i + j] = 0;//Just want to test image 
                 //0 is black 
          data_all2[nSize2*i + j] = 65535;//Just want to test      image              
                 //65535 is white 
         } 
       } 
        cvSetData(Image1, data_all, step); 
        cvSetData(Image2, data_all2, step); 
        ShowImage(Image1, IDC_ShowImg);//have a error 
        ShowImage(Image2, IDC_ShowImg2); //have a error 
      } 
      Image1 = NULL; 
      Image2 = NULL; 
      delete[] data; 
      delete[] data_all; 
      delete[] data2; 
      delete[] data_all2; 
     } 
     return(0); 
    } 
    void MFC_DMA::OnBnClickedButtonstart()//Open the thread 
    { 
      Info2.hWnd = this->m_hWnd; 
      AfxBeginThread(MyThreadButton2, (LPVOID)&Info2); 
      Start_Stop = TRUE; 
    } 
+0

"MFC_DMA :: MyThreadButton2 (...)" statik işlevinden 'MFC_DMA :: ShowImage (...) 'statik olmayan işlevini çağırmaya çalışıyorsunuz. ('ShowImage' olarak adlandırılabilmek için statik iş parçacığına 'MFC_DMA'_ örneğine bir _pointer geçirmeniz gerekiyor. Ayrıca bir iş parçacığından GUI'ye erişmeye çalışıyorsunuz. iyi bir fikir değil (bkz. [bu soru] (http://stackoverflow.com/questions/18462347/mfc-accessing-gui-from-another-thread)) –

+0

Cevabınız için teşekkür ederiz. MFC_DMA :: ShowImage statik olmayan işlevden çağrı MFC_DMA :: MyThreadButton2 (...). Bana bir örnek verebilir misiniz? teşekkürler –

+0

Zaten geçirdiğiniz pencere tanıtıcısından uygun işaretçi oluşturduğunuz fark ettim iş parçacığı işlevi (biraz dolambaçlı, ama büyük bir anlaşma değil). Yani ... 'hWnd-> ShowImage (Resim1, IDC_ShowImg); –

cevap

0

Ben zaten pencere kolu uygun işaretçi oluşturmak fark sen iş parçacığı işlevine geçti (biraz dolambaçlı, ama büyük bir anlaşma değil). Yani ... hWnd->ShowImage(Image1, IDC_ShowImg); Dan Mašek