小弟是在MFC编写的
void CTry3Dlg::OnButton3() 
{
hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,NULL);
}
单步调试直接跳过该函数,无法进入该线程,请问是怎么回事啊?
顺便请教一下,小弟做一个摄像头的调用,要求单击一个按钮之后,摄像头的图像一直显示在picture控件上,程序倒是完成了。但是其他键无法单击,就是说图像是可以显示,但是程序假死了,单击之后过一会就报错小弟猜测是不是因为显示函数是死循环的原因,于是就想用多线程来做不知道思路对不对,请各位前辈速救啊!

解决方案 »

  1.   

    你的这个ThreadFunc函数是全局函数吗?如果不是的话,需要定义为静态函数,你试试。
      

  2.   

    是全局函数
    void ThreadFunc()
    {
    int j;
    CvCapture* capture;
    unsigned char **R,**G,**B;
        capture=cvCreateCameraCapture(0);
        assert(capture!=NULL);
        //IplImage* frame;
    while (m_bRun)
    {
    TheImage=cvQueryFrame(capture); 
    }
      
     
    }
      

  3.   

    你线程函数的原型不对吧。CreateThread的话,它的线程函数原型是:
    DWORD WINAPI ThreadProc(
      __in  LPVOID lpParameter
    );
    另外你写的是MFC程序,用AfxBeginThread来创建线程,线程函数为这样的
    UINT __cdecl ThreadProc(LPVOID lParam)
    {
     return 0;
    }
    定义为全局函数或者类的静态成员函数即可
      

  4.   

    你确定你在ThreadFunc函数下断点了?
    别告诉我你在CreateThread做的断点
      

  5.   

    请问是不是这样啊?程序报错,说要两个参数,我不会用这个函数
    void CTry3Dlg::OnButton3() 
    {
    CWinThread *pThread=AfxBeginThread(ThreadFunc);
    }
    UINT __cdecl ThreadFunc()
    {
    int j;
    CvCapture* capture;
    unsigned char **R,**G,**B;
      capture=cvCreateCameraCapture(0);
      assert(capture!=NULL);
      //IplImage* frame;
    while (m_bRun)
    {
    TheImage=cvQueryFrame(capture); 
    }
      
     return0;
    }
      

  6.   

    看看CreateThread的返回值,是不是出错了。
      

  7.   

    class CTry3Dlg
    {
    public:
    CTry3Dlg();
    virtual ~CTry3Dlg();
    private:
    static UINT ThreadFunc(LPVOID lparam);
    ......
    }void CTry3Dlg::OnButton3()  
    {
           AfxBeginThread(ThreadFunc,this);
    }UINT CTry3Dlg::ThreadFunc(LPVOID lparam)
    {
    int j;
    CvCapture* capture;
    unsigned char **R,**G,**B;
      capture=cvCreateCameraCapture(0);
      assert(capture!=NULL);
      //IplImage* frame;
    while (m_bRun)
    {
    TheImage=cvQueryFrame(capture);  
    }
       
     return0;
    }
      

  8.   

    问题解决了谢谢强大的各位!最后问一个小问题
           AfxBeginThread(ThreadFunc,this);此函数里面的线程函数可以是全局的吗?
    是全局的话怎么写?
      

  9.   

    线程函数必须是static或着全局的。 ThreadFunc可是是CTry3Dlg的static成员。
      

  10.   

    哦,那如果是全局函数那afxbeginthread()这个函数参数怎么写呢?
      

  11.   

    直接看看这个吧:http://blog.csdn.net/hoozh/article/details/1430374
    比较详细。
      

  12.   

    线程函数写成全局函数与类中的静态函数写法类似。只是有一个问题。在全局函数中访问该类的变量时,变量要定义成public类型变量,不能访问private类型变量。不利于类的封装和移植。