快要崩溃了,100分这个有关问题,是小弟我的程序结构不对还是什么原因呢?搞了很长时间了.
快要崩溃了,100分求助这个问题,是我的程序结构不对还是什么原因呢?搞了很长时间了...
程序大概的流程是这样的:
//------CFilterDlg.h
class CFilterDlg : public CDialog
{
public:
//--------线程1------//
static UINT SimulinkThread(void *param);//计算
CWinThread *pWorkSimulinkThread;
//--------线程2-------//
static UINT IntCheckThread(void *param);//查询
CWinThread *pCheckThread;
......
}
//--------CFilterDlg.cpp
CEvent gPulseEvent; //全局变量,初始无信号,自动事件
int Simuflags=1; //判断SimulinkThread内部计算操作是否执行完
int SimuOK_Number=0; //线程pWorkSimulinkThread中计算正常完成的次数
int SimuERROR_Number=0; //线程pWorkSimulinkThread中计算未完成,丢弃获取到的脉冲的次数
void CFilterDlg::OnStartCheck()
{
//创建线程
pCheckThread=AfxBeginThread(IntCheckThread,this,THREAD_PRIORITY_HIGHEST);
pWorkSimulinkThread=AfxBeginThread(SimulinkThread,this,THREAD_PRIORITY_ABOVE_NORMAL);
}
//-------轮询线程函数体-------//
UINT CFilterDlg::IntCheckThread(void *param)
{
CFilterDlg *dlg=(CFilterDlg *) param;
dlg-> GetParent();
while(1) //不停的查询
{
if (外部脉冲频率有输入) //外部输入频率为500Hz,即2ms获取一次脉冲
{
if(1==Simuflags) //////问题所在
{
++SimuOK_Number;
gPulseEvent.SetEvent(); //使事件有效
}
else if(0==Simuflags) //////问题所在
{
SimuERROR_Number++; //计算未结束,丢弃此次频率输入,继续下次查询
}
}
}
return 0;
}
//---------线程2函数体------------//
UINT CFilterDlg::SimulinkThread(void *param)
{
CFilterDlg *dlgDatasend=(CFilterDlg *) param;
dlgDatasend-> GetParent();
while(1)
{
WaitForSingleObject(gPulseEvent.m_hObject,0); //自动ResetEvent
Simuflags=0; //开始计算
... //计算过程,此过程约耗0.8ms左右时间
Simuflags=1; //计算结束
}
return 0;
}
出现的问题是SimuOK_Number的个数为2000多时,SimuERROR_Number的次数就已经有200多了,也就是说SimulinkThread函数体里面的计算部分未能执行完成。这个郁闷了,我的计算过程只有0.8ms左右,外部的脉冲间隔是2ms左右,怎么会来不及处理呢?
是不是我的程序结构设计的不多呢?
我以前是这样做的:(没有用到事件类,每次获取到脉冲后就重新创建线程,频繁的开关线程比较耗资源,所以想用事件类,但这样反而出现了上述那个问题)
//------CFilterDlg.h
class CFilterDlg : public CDialog
{
public:
//--------线程1------//
static UINT SimulinkThread(void *param);//计算
CWinThread *pWorkSimulinkThread;
//--------线程2-------//
static UINT IntCheckThread(void *param);//查询
CWinThread *pCheckThread;
......
}
//------CFilterDlg.cpp
int Simuflags=1; //判断SimulinkThread内部计算操作是否执行完
int SimuOK_Number=0; //线程pWorkSimulinkThread中计算正常完成的次数
int SimuERROR_Number=0; //线程pWorkSimulinkThread中计算未完成,丢弃获取到的脉冲的次数
void CFilterDlg::OnStartCheck()
{
pCheckThread=AfxBeginThread(IntCheckThread,this,THREAD_PRIORITY_TIME_CRITICAL);
}
//-------轮询线程函数体-------//
程序大概的流程是这样的:
//------CFilterDlg.h
class CFilterDlg : public CDialog
{
public:
//--------线程1------//
static UINT SimulinkThread(void *param);//计算
CWinThread *pWorkSimulinkThread;
//--------线程2-------//
static UINT IntCheckThread(void *param);//查询
CWinThread *pCheckThread;
......
}
//--------CFilterDlg.cpp
CEvent gPulseEvent; //全局变量,初始无信号,自动事件
int Simuflags=1; //判断SimulinkThread内部计算操作是否执行完
int SimuOK_Number=0; //线程pWorkSimulinkThread中计算正常完成的次数
int SimuERROR_Number=0; //线程pWorkSimulinkThread中计算未完成,丢弃获取到的脉冲的次数
void CFilterDlg::OnStartCheck()
{
//创建线程
pCheckThread=AfxBeginThread(IntCheckThread,this,THREAD_PRIORITY_HIGHEST);
pWorkSimulinkThread=AfxBeginThread(SimulinkThread,this,THREAD_PRIORITY_ABOVE_NORMAL);
}
//-------轮询线程函数体-------//
UINT CFilterDlg::IntCheckThread(void *param)
{
CFilterDlg *dlg=(CFilterDlg *) param;
dlg-> GetParent();
while(1) //不停的查询
{
if (外部脉冲频率有输入) //外部输入频率为500Hz,即2ms获取一次脉冲
{
if(1==Simuflags) //////问题所在
{
++SimuOK_Number;
gPulseEvent.SetEvent(); //使事件有效
}
else if(0==Simuflags) //////问题所在
{
SimuERROR_Number++; //计算未结束,丢弃此次频率输入,继续下次查询
}
}
}
return 0;
}
//---------线程2函数体------------//
UINT CFilterDlg::SimulinkThread(void *param)
{
CFilterDlg *dlgDatasend=(CFilterDlg *) param;
dlgDatasend-> GetParent();
while(1)
{
WaitForSingleObject(gPulseEvent.m_hObject,0); //自动ResetEvent
Simuflags=0; //开始计算
... //计算过程,此过程约耗0.8ms左右时间
Simuflags=1; //计算结束
}
return 0;
}
出现的问题是SimuOK_Number的个数为2000多时,SimuERROR_Number的次数就已经有200多了,也就是说SimulinkThread函数体里面的计算部分未能执行完成。这个郁闷了,我的计算过程只有0.8ms左右,外部的脉冲间隔是2ms左右,怎么会来不及处理呢?
是不是我的程序结构设计的不多呢?
我以前是这样做的:(没有用到事件类,每次获取到脉冲后就重新创建线程,频繁的开关线程比较耗资源,所以想用事件类,但这样反而出现了上述那个问题)
//------CFilterDlg.h
class CFilterDlg : public CDialog
{
public:
//--------线程1------//
static UINT SimulinkThread(void *param);//计算
CWinThread *pWorkSimulinkThread;
//--------线程2-------//
static UINT IntCheckThread(void *param);//查询
CWinThread *pCheckThread;
......
}
//------CFilterDlg.cpp
int Simuflags=1; //判断SimulinkThread内部计算操作是否执行完
int SimuOK_Number=0; //线程pWorkSimulinkThread中计算正常完成的次数
int SimuERROR_Number=0; //线程pWorkSimulinkThread中计算未完成,丢弃获取到的脉冲的次数
void CFilterDlg::OnStartCheck()
{
pCheckThread=AfxBeginThread(IntCheckThread,this,THREAD_PRIORITY_TIME_CRITICAL);
}
//-------轮询线程函数体-------//