求助:QT2.3.7中使用了QThread,线程运行一段时间之后就Killed

程序员小哈
嵌入式领域优质创作者
博客专家认证
2010-09-07 09:42:21
大家好,有个问题请教大家,我在QT2.3.7中使用了QThread,线程运行一段时间之后就Killed,线程里面用到了QThread::postEvent(pMonitor, event1); 向主线程发事件消息,我猜是这地方的问题,Google了没有找到解决方案,大家谁遇到过,指点一下呗


class myEvent : public QCustomEvent
{
public:
myEvent(int i) : QCustomEvent(12345), id(i) {};
int id;
};
//线程类
void MonitorThread::run()
{
myEvent *event1 = new myEvent(1);
myEvent *event2 = new myEvent(2);
myEvent *event3 = new myEvent(3);
myEvent *event4 = new myEvent(4);
myEvent *event5 = new myEvent(5);

int nStatusIn1,nStatusIn2,nStatusIn3,nStatusIn4,nStatusIn5;
nStatusIn1=nStatusIn2=nStatusIn3=nStatusIn4=nStatusIn5 =10;
int bDipFinished_1 = TRUE;
int bDipFinished_2 = TRUE;
int bDipFinished_3 = TRUE;
int bDipFinished_4 = TRUE;
int bDipFinished_5 = TRUE;

//IO控制
int fd;
int val=-1;

if( (fd=open(DEVICE_GPIOTEST,O_RDWR | O_NONBLOCK)) < 0 )
{
perror("can not open device");
return;
}

while(1)
{
if(bDipFinished_1)
{
nStatusIn1 = ioctl(fd,PA1,0);
if(!nStatusIn1) //低电平有效
{
//蜂鸣器响
QThread::postEvent(pMonitor, event1);
printf("bDipFinished_1 = FALSE \n");
bDipFinished_1 = FALSE;
}
}
else
{
nStatusIn1 = ioctl(fd,PA1,0);
if(nStatusIn1) //低电平有效
{
//蜂鸣器停
bDipFinished_1 = TRUE;
printf("bDipFinished_1 = TRUE \n");
}
}

if(bDipFinished_2)
{
nStatusIn2 = ioctl(fd,PA2,0);
if(!nStatusIn2) //低电平有效
{
//蜂鸣器响
//sleep 100 ms
//蜂鸣器停
//sleep 100 ms
QThread::postEvent(pMonitor, event2);
printf("bDipFinished_2 = FALSE \n");
bDipFinished_2 = FALSE;
}
}
else
{
nStatusIn2 = ioctl(fd,PA2,0);
if(nStatusIn2) //低电平有效
{
//蜂鸣器停
bDipFinished_2 = TRUE;
printf("bDipFinished_2 = TRUE \n");
}
}

if(bDipFinished_3)
{
nStatusIn3 = ioctl(fd,PA3,0);
if(!nStatusIn3) //低电平有效
{
//蜂鸣器响
QThread::postEvent(pMonitor, event3);
printf("bDipFinished_3 = FALSE \n");
bDipFinished_3 = FALSE;
}
}
else
{
nStatusIn3 = ioctl(fd,PA3,0);
if(nStatusIn3) //低电平有效
{
//蜂鸣器停
bDipFinished_3 = TRUE;
printf("bDipFinished_3 = TRUE \n");
}
}

if(bDipFinished_4)
{
nStatusIn4 = ioctl(fd,PA4,0);
if(!nStatusIn4) //低电平有效
{
//蜂鸣器响
QThread::postEvent(pMonitor, event4);
printf("bDipFinished_4 = FALSE \n");
bDipFinished_4 = FALSE;
}
}
else
{
nStatusIn4 = ioctl(fd,P
...全文
255 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序员小哈 2010-09-17
  • 打赏
  • 举报
回复
我实验后发现myEvent *event1 = new myEvent(1);还必须放到while里,不然程序异常,我现在放在while里面了,有点说不清楚道理,先结贴吧,一人一半^_^
wsj239237 2010-09-08
  • 打赏
  • 举报
回复
楼主别听2l的,你的做法对的,new出来的东西,如果没有父类,是需要手动delete的
放到while且没有手动delete才会内存不段扩大

代码上看不出有什么明显问题,会不会是pMonitor 或者 myEvent 类写的有问题呢
程序员小哈 2010-09-08
  • 打赏
  • 举报
回复
谢谢wsj239237,我还在找问题的出处,现在还没有什么进展,这个帖子过两天再结哈,大家有什么想法,告诉我一下哈
程序员小哈 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qqyanchong 的回复:]
楼主,建议你将
myEvent *event1 = new myEvent(1);
myEvent *event2 = new myEvent(2);
myEvent *event3 = new myEvent(3);
myEvent *event4 = new myEvent(4);
myEvent *event5 = new myEvent(5);
放到while的……
[/Quote]

谢谢您的回复,我下午试试,针对你的提议,我有点疑问,我放在while外面和里面有很大不同吗?我的线程就启动时建立一次,也就是说,上面五个event事件只建立一次,会使内存不断扩大吗?我的线程是用于监控按键状态的
yanchong 2010-09-07
  • 打赏
  • 举报
回复
楼主,建议你将
myEvent *event1 = new myEvent(1);
myEvent *event2 = new myEvent(2);
myEvent *event3 = new myEvent(3);
myEvent *event4 = new myEvent(4);
myEvent *event5 = new myEvent(5);
放到while的循环里面,这样他是在while中每次循环都会清楚,避免内存不断扩大。
程序员小哈 2010-09-07
  • 打赏
  • 举报
回复
自己顶一下,大家帮帮忙呀

16,240

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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