看看多线程同步的书。
例如:
void CCalibPage1::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
UpdateData()
m_nCounter++
double r
CSingleLock sLock(&(gpMainFrm->m_mutex))
sLock.Lock()//此处锁定
double v = gSpindleRevolution
sLock.Unlock()//存取后释放。
if(m_bCalibStart)
{
r = m_CalibValue/v
m_szTestValue0.Format("%f",v)
// m_szTestValue.Format("%f", (v * r))
m_szRatio.Format("%f", r)//
UpdateData(false)
}
else if(m_bVerify)
{
m_szTestValue.Format("%f",v*gcConfig.calib[PCL833_CHANNEL].ratio)
UpdateData(false)
}
if(m_nCounter >30)
{
KillTimer(11)
m_bCalibStart = false
m_bVerify = false
MessageBox(_T("标定完成!"),_T("CNCTest"))
UpdateButtonStatus()
}
CPropertyPage::OnTimer(nIDEvent)
}
参见:
http://baike.baidu.com/view/2808915.htm
定义一个全局的互斥事件CMunex cMunex;当你在一个线程里要连接数据库的时候可以这样:cMunex.lock()
处理完以后可以这样 :cMunex.unlock()
这样就OK了。应该可以解决问题了
在VC++中利用MFC编程时,线程被分为工作者线程和用户界面线程两大类。前者用于处理后台任务,执行后台任务并不会耽搁用户对应用程序的使用,即用户 *** 作无需等待后台任务的完成。后者常用来独立的处理用户输入和响应用户事件。一个工作者线程的实现相当的简单,只需要编写线程控制函数和启动函数就好。启动函数:
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL )
用户界面线程的实现通常需要派生线程类、重载成员函数和启动用户界面线程。从MFC的CWindThread派生用户界面线程类。父类CWinThread需要重载的函数主要有:InitInstance、ExitInstance和Run。其中InitInstance必须重载,而Run函数除非必要,一般无需重载。其中,启动函数:
CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL )
建议学习Visual C++6.0编程使用技术与案例,看看多线程编程。。。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)