UINT TestThread(LPVOID pParam)//回调函数
{ CDatacollectDlg* pDlg=(CDatacollectDlg*)pParam;
//等待启动信号,如没有将一直等待下去
::WaitForSingleObject(m_begin,INFINITE);
pDlg->OnSavedata();//存储数据函数
return 0;
}
void CDatacollectDlg::OnRunButton()//开始运行函数
{...
 ...
AfxBeginThread(TestThread,GetSafeHwnd());//启动线程}
问题是:该线程不能启动,问题在于“WaitForSingleObject”句,不知如何修改!请各位仁兄赐教!谢谢!甚急!

解决方案 »

  1.   

    不好意思,对于VC的多线程我也不太明白,BCB的倒还知道,帮不了你了,帮你UP一下。
      

  2.   

    你启动线程时得对你的m_begin置信号。
    SetEvent(m_begin);
    记得初始化你的m_begin哟。呵呵呵。看看MSDN吧。
    CreateEvent API等
      

  3.   

    我是这样做的!还是不行,问题在于::WaitForSingleObjectm_begin,INFINITE);,请问各位,是不是有错误呢?这句该如何修改!谢谢!
      

  4.   

    同意lyy_hill(Lee)::WaitForSingleObjectm_begin,INFINITE)
    从这句看不出什么,你多得贴一点相关代码才行。
      

  5.   

    一定要检验返回值!if(::WaitForSingleObject(m_begin,INFINITE)== WAIT_OBJECT_0){
    }还有你的信号量设得对不对?
      

  6.   

    启动线程之前要初始化m_begin,CreateEvent(NULL,false,false,NULL)。线程启动之后,需要把m_begin置信号态
    可以在另外一个另外一个事件如点击某个按钮的时候调用SetEvent(m_begin)即可另外:按照你的写法,m_begin似乎不是类的成员函数,而是一个模块变量,不妥。
      

  7.   

    CEvent m_begin;//启动线程事件
    UINT TestThread(LPVOID pParam)//回调函数
    { CDatacollectDlg* pDlg=(CDatacollectDlg*)pParam;
    //等待启动信号,如没有将一直等待下去
     if(::WaitForSingleObject(m_begin,INFINITE)== WAIT_OBJECT_0)
         {
             AfxMessageBox("Hello");
    pDlg->OnSavedata();//存储数据函数
    }
    }
    BOOL CDatacollectDlg::OnInitDialog()
    {..............
       m_begin.ResetEvent();
    }void CDatacollectDlg::OnRunButton()//开始运行函数
    {...
     CDatacollectDlg::OnRun();//数据采集函数
    AfxBeginThread(TestThread,GetSafeHwnd());//启动线程,即采集完数据后,启动存储线程进行数据保存!
    m_begin.SetEvent();}
    运行结果:弹出“hello"信息对话框,执行到此处就出现断言错误!系统文件D:\Microsoft Visual studio\vc98\MFC\SRC\wincore.cpp中的函数(下面)有错误:
    void CWnd::AssertValid() const
    {
    return;     // null (unattached) windows are valid// check for special wnd??? values
    ASSERT(HWND_TOP == NULL);       // same as desktop
    if (m_hWnd == HWND_BOTTOM)
    ASSERT(this == &CWnd::wndBottom);
    else if (m_hWnd == HWND_TOPMOST)
    ASSERT(this == &CWnd::wndTopMost);
    else if (m_hWnd == HWND_NOTOPMOST)
    ASSERT(this == &CWnd::wndNoTopMost);
    else
    {
    // should be a normal window
    ASSERT(::IsWindow(m_hWnd));// should also be in the permanent or temporary handle map
    CHandleMap* pMap = afxMapHWND();
    ASSERT(pMap != NULL); CObject* p;
    ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||
    (p = pMap->LookupTemporary(m_hWnd)) != NULL);
    ASSERT((CWnd*)p == this);   // must be us此行有错误! // Note: if either of the above asserts fire and you are
    // writing a multithreaded application, it is likely that
    // you have passed a C++ object from one thread to another
        // and have used that object in a way that was not intended.
    // (only simple inline wrapper functions should be used)
    //
    // In general, CWnd objects should be passed by HWND from
    // one thread to another.  The receiving thread can wrap
    // the HWND with a CWnd object by using CWnd::FromHandle.
    //
    // It is dangerous to pass C++ objects from one thread to
    // another, unless the objects are designed to be used in
    // such a manner.
    }
    }
      
    如何修改!请各位仁兄赐教!谢谢!甚急!