我定义的一个类(有静态数据成员)分别在两个线程中使用(作为线程类的成员)会不会出现什么问题?

ciml 2002-11-16 01:14:12
我是在两个线程中开启的计时器,但我发现两个线程开启时间长了后
系统变得越来越慢了!
...全文
71 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljb198102 2002-11-16
  • 打赏
  • 举报
回复
不会的,
线程是只公用同一代码区,不同的数据区
所以对同一类来说,应该是没问题
ciml 2002-11-16
  • 打赏
  • 举报
回复
ahalf(ahalf)
我不太明白你的意思,我处理前,先KillTimer,处理后完再SetTimer
是否就避免了重入

int CGPSThread::Run()
{
MSG msg;
//通过主线程窗口句柄建立一个窗口类指针
CWnd *MainThreadWnd=CWnd::FromHandle(m_hMainWnd);
while(::GetMessage(&msg,NULL,0,0))
{
if(msg.message!=WM_TIMER)
continue; //只处理计时器消息
KillTimer(NULL,m_nTimer);
int isOK,x,y;
switch(m_Task)
{
case THREAD_TASK_SENDGPS: //发送GPS数据
//调用AfxEndThread()后,下面的代码永远不会执行
if(!m_gps.m_bOpened && !m_gps.Open(4,4800)) //无法打开端口
{
MainThreadWnd->PostMessage(WM_GPSTHREAD_ERREND,10,0);
AfxEndThread(0,TRUE);
}
if(!m_gps.Getdata()) //采集数据发生错误
{
MainThreadWnd->PostMessage(WM_GPSTHREAD_ERREND,11,0);
AfxEndThread(0,TRUE);
}
//发送
isOK=m_MapProxy.SendGpsToIBM(m_gps.m_csLongtitude,m_gps.m_csLatitude);
if(isOK==1)//成功
MainThreadWnd->PostMessage(WM_UPDATE_GPSSHOW,0,0);
else //失败,将错误代码通知主线程,线程退出
{
MainThreadWnd->PostMessage(WM_GPSTHREAD_ERREND,isOK,0);
AfxEndThread(0,TRUE);
}
break;

//任务是获取位置,在屏幕上显示移动轨迹
case THREAD_TASK_GETMAPPOS: //请求:获取位置,用于画轨迹
if(m_MapProxy.GetUserPosition(x,y)) //成功
MainThreadWnd->PostMessage(WM_UPDATE_TRACK,x,y);
else //失败
{
MainThreadWnd->PostMessage(WM_GPSTHREAD_ERREND,x,0);
AfxEndThread(0,TRUE);
}
break;
} //end switch
m_nTimer=SetTimer(NULL,1,m_TimerElapse,NULL);
}//end while
if(m_nTimer)
KillTimer(NULL,m_nTimer);
m_gps.PortClose(); //关闭端口
return CWinThread::Run();
}


关键是m_MapProxy.SendGpsToIBM(),该过程涉及大量处理代码
如果我注释调此句则没有问题
SGUav 2002-11-16
  • 打赏
  • 举报
回复
线程之间不能共享 MFC 对象,除非是派生于 CObject 或是如 CString 或 CRect 等较为简单的类
ahalf 2002-11-16
  • 打赏
  • 举报
回复
要防止计时器处理程序的重入

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧