天嵌 ARM开发社区

 找回密码
 注册
查看: 2714|回复: 9

TQ244的QT文件系统自动关闭我的QT程序

[复制链接]
cqqjj3887 发表于 2013-6-25 15:11:19 | 显示全部楼层 |阅读模式
版主你好,前段时间问你们要了最新的tqpda程序,但是仍然会存在内存泄露,后面问了技术部的工程师说跑自己的工程可以不依赖tqpda,建议开机不启动,现在把开启tqpda这个程序换成了开机启动自己的程序,现在遇到问题如下:
1)我实时的使用top命令查看了自己程序的内存占有和cpu占有情况,发现自己程序的内存和cpu占有率都比较稳定,没有出现一直增加的情况,但是在运行几个小时后,QT程序自己就被关掉了,屏幕变为黑屏的。
2)由此弄了另一块开发板,然后开机不启动tqpda程序和自己的QT程序,开机后界面就是一直显示天嵌的logo标志,但是过一个多小时,屏幕同样变为黑屏。
请问出现这样的情况是我程序的问题,还是开机不启动tqpda程序的QT文件系统会不稳定导致关闭程序,变为黑屏?
TQ-lkp 发表于 2013-6-25 16:35:21 | 显示全部楼层
把你的代码贴上来看下
 楼主| cqqjj3887 发表于 2013-6-26 15:16:08 | 显示全部楼层
本帖最后由 cqqjj3887 于 2013-6-26 15:20 编辑
TQ-lkp 发表于 2013-6-25 16:35
把你的代码贴上来看下

串口打开程序和创建线程程序均由按键“start”控制 ,具体函数如下
Serial_fd =:: open("/dev/ttySAC1", O_RDWR);
    if(Serial_fd!=-1)
      serial_open_flag=1;
    else
    perror("Can not open Serial_Port \n!");
    memset(&opt, 0, sizeof opt);
    tcgetattr(Serial_fd, &opt);
    tcflush(Serial_fd, TCIOFLUSH);
    cfsetispeed(&opt,B19200);
    cfsetospeed(&opt,B19200);
    status = tcsetattr(Serial_fd, TCSANOW, &opt);
    if(status != 0)
    {
            perror("tcsetattr fd1");
    }
    tcflush(Serial_fd, TCIOFLUSH);
    tcgetattr(Serial_fd, &opt);
    opt.c_cflag &= ~CRTSCTS;//设置流控制为无流控制
    opt.c_cflag &= ~CSIZE;
    opt.c_cflag |=CS8;

    /*---------偶校验-----------*/
    opt.c_cflag |= PARENB;
    opt.c_cflag &= ~PARODD;
    opt.c_iflag &= ~INPCK;


    opt.c_cflag &= ~CSTOPB;
    opt.c_cc[VTIME] = 30;
    opt.c_cc[VMIN] = 0;
    opt.c_iflag &= ~ICRNL;
    opt.c_iflag &= ~IXON;
    opt.c_oflag &= ~OPOST;
    opt.c_lflag &= ~ISIG;
    opt.c_lflag &= ~ICANON;
    opt.c_lflag &= ~ECHO;
    opt.c_lflag &= ~ECHOE;
    opt.c_lflag &= ~ECHOK;
    tcflush(Serial_fd, TCIFLUSH);
    if (tcsetattr(Serial_fd, TCSANOW, &opt) != 0) {
        #ifdef debug
            perror("SetupSerial 3");
            #endif
    }
    tcgetattr(Serial_fd, &opt);

    if (tcsetattr(Serial_fd, TCSANOW, &opt) != 0) {
            perror("SetupSerial 3");
    }
    if(serial_open_flag==1&&create_thread_flag!=0)
    create_thread_flag=pthread_create(&a_thread,NULL,thread_function,(void *)this);
    printf("create_thread_flag=%d\n",create_thread_flag);


 楼主| cqqjj3887 发表于 2013-6-26 15:16:48 | 显示全部楼层
本帖最后由 cqqjj3887 于 2013-6-26 15:17 编辑
TQ-lkp 发表于 2013-6-25 16:35
把你的代码贴上来看下

下面是线程函数的内容
void *thread_function(void *arg)
{
  close_thread_flag=0;
  pthread_testcancel();
  res=pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
  if(res!=0)
  {
      perror("pthread_setcancelstate falied\n");
  }
  res=pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
  if(res!=0)
  {
      perror("pthread_setcanceltype falied\n");
  }
  while(!close_thread_flag)
  {
    usleep(100);
    /*打开文本文件存储数据*/
    strcpy(path,path_head);//复制sd卡路径到path数组
    time(&rawtime);//获取系统时间
    timeinfo=localtime(&rawtime);
    year=timeinfo->tm_year-100;
    timeinfo->tm_mon=timeinfo->tm_mon+1;
    //printf("%d.%d.%d %d:%d:%d  ",year,timeinfo->tm_mon,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
    a1=year/10;
    a2=year%10;
    switch(a1)
    {
        case 0: path_body[0]=48;break;
        case 1: path_body[0]=49;break;
        case 2: path_body[0]=50;break;
        case 3: path_body[0]=51;break;
        case 4: path_body[0]=52;break;
        case 5: path_body[0]=53;break;
        case 6: path_body[0]=54;break;
        case 7: path_body[0]=55;break;
        case 8: path_body[0]=56;break;
        case 9: path_body[0]=57;break;
        default:break;
    }
    switch(a2)
    {
        case 0: path_body[1]=48;break;
        case 1: path_body[1]=49;break;
        case 2: path_body[1]=50;break;
        case 3: path_body[1]=51;break;
        case 4: path_body[1]=52;break;
        case 5: path_body[1]=53;break;
        case 6: path_body[1]=54;break;
        case 7: path_body[1]=55;break;
        case 8: path_body[1]=56;break;
        case 9: path_body[1]=57;break;
        default:break;
    }
    a1=timeinfo->tm_mon/10;
    a2=timeinfo->tm_mon%10;
    switch(a1)
    {
        case 0: path_body[2]=48;break;
        case 1: path_body[2]=49;break;
        case 2: path_body[2]=50;break;
        case 3: path_body[2]=51;break;
        case 4: path_body[2]=52;break;
        case 5: path_body[2]=53;break;
        case 6: path_body[2]=54;break;
        case 7: path_body[2]=55;break;
        case 8: path_body[2]=56;break;
        case 9: path_body[2]=57;break;
        default:break;
    }

    switch(a2)
    {
        case 0: path_body[3]=48;break;
        case 1: path_body[3]=49;break;
        case 2: path_body[3]=50;break;
        case 3: path_body[3]=51;break;
        case 4: path_body[3]=52;break;
        case 5: path_body[3]=53;break;
        case 6: path_body[3]=54;break;
        case 7: path_body[3]=55;break;
        case 8: path_body[3]=56;break;
        case 9: path_body[3]=57;break;
        default:break;
    }
    a1=timeinfo->tm_mday/10;
    a2=timeinfo->tm_mday%10;
    switch(a1)
    {
        case 0: path_body[4]=48;break;
        case 1: path_body[4]=49;break;
        case 2: path_body[4]=50;break;
        case 3: path_body[4]=51;break;
        case 4: path_body[4]=52;break;
        case 5: path_body[4]=53;break;
        case 6: path_body[4]=54;break;
        case 7: path_body[4]=55;break;
        case 8: path_body[4]=56;break;
        case 9: path_body[4]=57;break;
        default:break;
    }
    switch(a2)
    {
        case 0: path_body[5]=48;break;
        case 1: path_body[5]=49;break;
        case 2: path_body[5]=50;break;
        case 3: path_body[5]=51;break;
        case 4: path_body[5]=52;break;
        case 5: path_body[5]=53;break;
        case 6: path_body[5]=54;break;
        case 7: path_body[5]=55;break;
        case 8: path_body[5]=56;break;
        case 9: path_body[5]=57;break;
        default:break;
    }
/*-------按日期创建文本文件------*/
    if(text_open_flag==false)
    {
        strcat(path,path_body);
        strcat(path,path_last);
        if((Data_store=fopen(path,"a+"))!=NULL)
            text_open_flag=true;
        strcpy(last_path_body,path_body);
        #ifdef debug
        printf("create txt\n");
        #endif
    }
    if(strcmp(last_path_body,path_body)!=0)
    {
         strcpy(last_path_body,path_body);
         strcat(path,path_body);
         strcat(path,path_last);
         if(text_open_flag==true)
         {
             fclose(Data_store);
             text_open_flag=false;
         }
         if(text_open_flag==false)
         {
             if((Data_store=fopen(path,"a+"))==NULL)
                 text_open_flag=true;
         }
     }
    if((Ant1_Selected_flag==true&&(A1_S1==true||A1_S2==true||A1_S3==true||A1_S4==true||A1_S5==true||A1_S6==true))
        ||(Ant2_Selected_flag==true&&(A2_S1==true||A2_S2==true||A2_S3==true||A2_S4==true||A2_S5==true||A2_S6==true))
        ||(Ant3_Selected_flag==true&&(A3_S1==true||A3_S2==true||A3_S3==true||A3_S4==true||A3_S5==true||A3_S6==true))
        ||(Ant4_Selected_flag==true&&(A4_S1==true||A4_S2==true||A4_S3==true||A4_S4==true||A4_S5==true||A4_S6==true)))
    fprintf(Data_store,"%d.%d.%d %d:%d:%d  ",year,timeinfo->tm_mon,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);


    if(Ant1_Selected_flag==true)
    {
      if(A1_S1==true)
      {
        Write_flag=write(Serial_fd,serial_ouput_A1_S1,2);
        printf("write %d\n",Write_flag);
        usleep(100);
        nread=read(Serial_fd,buff,8);
        if(nread>0)
        {
            freq[0]=buff[3];
            freq[1]=buff[2];
            freq[2]=buff[1];
            freq[3]=buff[0];
            power[0]=buff[7];
            power[1]=buff[6];
            power[2]=buff[5];
            power[3]=buff[4];
            Freq=(float*)freq;
            Power=(int*)power;
            freq_value_a1=*Freq;
            freq_value_a1=freq_value_a1*1000;
            power_value_a1=*Power;
            fprintf(Data_store,"A1 %5.1f %d ",freq_value_a1,power_value_a1);
            printf("A1_S1 Freq value=%f\n",freq_value_a1);
            printf("A1_S1 Power value=%d\n",power_value_a1);
            sprintf(cc,"%5.1f",freq_value_a1);
            string_freq_a1.assign(cc);
            qstring_freq_a1=QString::fromLocal8Bit(string_freq_a1.c_str());
            sprintf(dd,"%d",power_value_a1);
            string_power_a1.assign(dd);
            qstring_power_a1=QString::fromLocal8Bit(string_power_a1.c_str());
            for(int i=0;i<nread;i++)
            {
            printf("%x  ",buff);
            }
            printf("A1_S1 read %d\n",nread);
        }
        else
        {
            qstring_freq_a1="no data";
            qstring_power_a1='0';
            power_value_a1=0;
            printf("A1_S1 read %d\n",nread);
        }
      }
      if(A1_S2==true)
      {
        Write_flag=write(Serial_fd,serial_ouput_A1_S2,2);
        printf("write %d\n",Write_flag);
        usleep(100);
        nread=read(Serial_fd,buff,8);
        if(nread>0)
        {
            freq[0]=buff[3];
            freq[1]=buff[2];
            freq[2]=buff[1];
            freq[3]=buff[0];
            power[0]=buff[7];
            power[1]=buff[6];
            power[2]=buff[5];
            power[3]=buff[4];
            Freq=(float*)freq;
            Power=(int*)power;
            freq_value_a2=*Freq;
            freq_value_a2=freq_value_a2*1000;
            power_value_a2=*Power;
            fprintf(Data_store,"A2 %5.1f %d ",freq_value_a2,power_value_a2);
            printf("A1_S2 Freq value=%f\n",freq_value_a2);
            printf("A1_S2 Power value=%d\n",power_value_a2);
            sprintf(cc,"%5.1f",freq_value_a2);
            string_freq_a2.assign(cc);
            qstring_freq_a2=QString::fromLocal8Bit(string_freq_a2.c_str());
            sprintf(dd,"%d",power_value_a2);
            string_power_a2.assign(dd);
            qstring_power_a2=QString::fromLocal8Bit(string_power_a2.c_str());
            for(int i=0;i<nread;i++)
            {
            printf("%x  ",buff);
            }
            printf("A1_S2 read %d\n",nread);
        }
        else
        {
            qstring_freq_a2="no data";
            qstring_power_a2='0';
            power_value_a2=0;
            printf("A1_S2 read %d\n",nread);
        }
      }
.......//其他的还有22个类似的发送接收代码,并存储数据到文本文件中
}//while循环结束
  if(text_open_flag==true)
    fclose(Data_store);
  text_open_flag=false;
  if(serial_open_flag==1)
    ::close(Serial_fd);//关闭串口
  pthread_cancel(a_thread);
  return 0;
}线程函数到此结束
 楼主| cqqjj3887 发表于 2013-6-26 15:18:36 | 显示全部楼层
TQ-lkp 发表于 2013-6-25 16:35
把你的代码贴上来看下

还有我创建了一个定时器,每秒刷新一次数据
创建方式如下
temperature::temperature(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::temperature)
{
...
QTimer *timer=new QTimer(this);
.......//均是信号和槽的连接函数
  connect( timer, SIGNAL( timeout() ), this, SLOT( timer_display() ) );
timer->start(1000);
}
//定时器刷新界面函数
void temperature::timer_display()
{
    if(Start_flag==true&&Ant1_Selected_flag==true)
    {
        if(A1_S1==true)
        {
            ui->Ant1_sensor1_temperature->setText(qstring_freq_a1);
            ui->Ant1_sensor1_strength->setText(qstring_power_a1);
            ui->Ant1_sensor1_progressBar->setValue(power_value_a1);
        }
        else
        {
            ui->Ant1_sensor1_temperature->setText("");
            ui->Ant1_sensor1_strength->setText("");
            ui->Ant1_sensor1_progressBar->setValue(0);
        }
......//其它与此类似
}
请楼主看下其中是否有什么地方有问题
TQ-lkp 发表于 2013-6-27 10:27:55 | 显示全部楼层
本帖最后由 TQ-lkp 于 2013-6-27 10:28 编辑

你做如下测试,将线程打开,但不要做任何操作,只是间隔休眠,看下程序运行是否会有问题

如果没有,说明你的机制没问题,剩下就是检查代码了,是代码异常没处理,导致程序挂掉了
如果有,说明你的调用机制有问题,看下会不会重复创建线程之类的
 楼主| cqqjj3887 发表于 2013-6-27 10:40:34 | 显示全部楼层
TQ-lkp 发表于 2013-6-27 10:27
你做如下测试,将线程打开,但不要做任何操作,只是间隔休眠,看下程序运行是否会有问题

如果没有,说明 ...

好的,我的线程是通过开始按钮创建线程,按停止按钮控制while循环的条件,while循环结束后,线程自动结束,请问版主,我的创建和退出线程部分由问题没呢?
还有请问间隔休眠是怎么弄呢?
TQ-lkp 发表于 2013-6-27 13:58:00 | 显示全部楼层
没看出有问题
休眠就是加sleep,即不要一直占用cpu
 楼主| cqqjj3887 发表于 2013-6-28 09:16:02 | 显示全部楼层
TQ-lkp 发表于 2013-6-27 13:58
没看出有问题
休眠就是加sleep,即不要一直占用cpu

版主,你好,我昨天新发现一个问题,想请教下你
我创建才线程,在使用pthread_cancel()函数取消后,再次使用开始按钮创建线程的时候,使用top命令内存会增加,即线程占有的资源未释放,后面添加了一句pthread_detach(pthread_self());释放执行结束后线程的空间!但是我用top命令查看,线程占用的内存不会仍然没有得到释放,只是再次创建线程的时候内存不会在增加,请问创建线程后,该线程占用的内存会一直保持直到程序退出后才能得到释放?
TQ-lkp 发表于 2013-7-1 09:27:07 | 显示全部楼层
这个问题就不好解释了,你慢慢研究下,有结果了通知一声
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-7-3 05:16 , Processed in 1.031250 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表