社区
进程/线程/DLL
帖子详情
我定义的一个类(有静态数据成员)分别在两个线程中使用(作为线程类的成员)会不会出现什么问题?
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
打赏
举报
回复
要防止计时器处理程序的重入
零基础Java入门课程-
类
和对象
新建、就绪、运行、阻塞、死亡
线程
的调度:sleep、yield、join、interrupt、wait 后台
线程
、定时任务
线程
的并发与同步、同步锁、同步块、
线程
安全的
类
Lock接口、CAS、volatile修饰符 内部
类
成员
内部
类
、本地内部...
C++
中
的
线程
函数如何访问
类
中
的
成员
变量
1. C++
中
如何
定义
线程
函数 有两种方法:a.
定义
线程
函数为全局函数 b.
定义
线程
函数为
类
的静态
成员
函数 ...如果要想在
线程
函数
中
访问和操作
类
的非静态
成员
变量,可以把
线程
函数作为
一个
适配器,在适
类
成员
函数作为
线程
函数
使用
类
成员
函数作为
线程
函数
使用
C++
类
成员
函数
使用
时,都
会
隐式传递
一个
this指针给该函数,this指针指向该
类
的对象。函数体可以通过显示调用该指针或直接访问
类
内
成员
。 回调函数是用指针来调用的函数,最常
使用
的回调...
类
的静态
成员
函数调用
类
非静态
成员
的方法
但是在有些情况下只能
使用
静态
成员
函数,比如
类
内绑定自身
成员
函数作为回调函数,这种情况在开启多
线程
时很常见,如果不想将回调
定义
为全局那只能
定义
为
类
静态了,为了避免过度破坏封装
类
中
应当尽量不要让
类
静态成原...
C++
类
中
定义
线程
1. C++
中
如何
定义
线程
函数 有两种方法:a.
定义
线程
函数为全局函数 b.
定义
线程
函数为
类
的静态
成员
函数 2. C++
中
的
线程
函数如何访问
类
中
的
成员
...如果要想在
线程
函数
中
访问和操作
类
的非静态
成员
变量,可以把
线程
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章