UINT TestThread(LPVOID pParam)//回调函数
{ CDatacollectDlg* pDlg=(CDatacollectDlg*)pParam;
//等待启动信号,如没有将一直等待下去
::WaitForSingleObject(m_begin,INFINITE);
pDlg->OnSavedata();//存储数据函数
return 0;
}
void CDatacollectDlg::OnRunButton()//开始运行函数
{...
...
AfxBeginThread(TestThread,GetSafeHwnd());//启动线程}
问题是:该线程不能启动,问题在于“WaitForSingleObject”句,不知如何修改!请各位仁兄赐教!谢谢!甚急!
{ CDatacollectDlg* pDlg=(CDatacollectDlg*)pParam;
//等待启动信号,如没有将一直等待下去
::WaitForSingleObject(m_begin,INFINITE);
pDlg->OnSavedata();//存储数据函数
return 0;
}
void CDatacollectDlg::OnRunButton()//开始运行函数
{...
...
AfxBeginThread(TestThread,GetSafeHwnd());//启动线程}
问题是:该线程不能启动,问题在于“WaitForSingleObject”句,不知如何修改!请各位仁兄赐教!谢谢!甚急!
解决方案 »
- 用MFC视频控件播放视频第四步怎么实现啊????
- MFC的SDI记事本程序如何实现自动换行的切换?
- 有把对话框作为LISTBOX 或listctrl 子项(item)的控件吗????
- vc中如何将crystal report 8.5的报表export为word,excel,或csv files?
- 急急!!为什么这样修改ACCESS字段名会出错?高手请进!!
- 怎么判别输入字符串是英文
- 通过installshield这么知道那些dll需要打包呢
- 请问,注释一段代码的快捷键!!!
- 请问如何将对话框中的命令按钮在程序运行的过程中灰化(disable)?
- MFC规则DLL有CLISD 和 IID么?
- 散分喽!!!----------圣旦快乐--------------新年快乐
- 在单文本文档中加入新的TOOLBAR应该如何操作?
SetEvent(m_begin);
记得初始化你的m_begin哟。呵呵呵。看看MSDN吧。
CreateEvent API等
从这句看不出什么,你多得贴一点相关代码才行。
}还有你的信号量设得对不对?
可以在另外一个另外一个事件如点击某个按钮的时候调用SetEvent(m_begin)即可另外:按照你的写法,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.
}
}
如何修改!请各位仁兄赐教!谢谢!甚急!