多线程中通过串口通信,i的值为combobox的返回值,根据选项执行相应操作,在为加入combobox时串口正常通信,无异常情况,加入messagebox之后在combobox选择几次后就会出现段错误而异常退出,求助下是什么原因导致的这种情况
void SerialThread::run() 
{ 
    extern int i;
    
    if(0 == i)
    {
      QMessageBox msgBox0;
      msgBox0.setText(QString::fromLocal8Bit("请选择要测试的板卡型号!"));
      //      msgBox.setIconPixmap(QPixmap("./456.jpg"));
      msgBox0.setStandardButtons(QMessageBox::Ok);
      msgBox0.setDefaultButton(QMessageBox::Ok);
      int ret0 = msgBox0.exec();
      
      switch(ret0)
    {
    case QMessageBox::Ok:
      break;
    default:
      break;
    }
      return; 
    }  
    else if(1 == i)
    {
      int fd,nwrite;    
      char buf[2] = {0x01,0x01};
      unsigned int buf1[8];
      struct termios oldtio;
      QMessageBox msgBox1;
      msgBox1.setText(tr("MAKE SURE"));
      msgBox1.setIconPixmap(QPixmap("./456.jpg"));
      msgBox1.setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel);
      msgBox1.setDefaultButton(QMessageBox::Ok);
      int ret1 = msgBox1.exec();
      
      fd = open(DEVICE, O_RDWR | O_NOCTTY );  
      printf("open serial succes!\nfd =%d\n",fd);
      if (fd <0)
    { 
      perror(DEVICE);  
      exit(1); 
    }    
  
      tcgetattr(fd,&oldtio); 
      set_nc_mode(fd); 
      printf("Changed to nc mode\n"); 
      
      if(ret1 == QMessageBox::Ok)
      {
      nwrite = write(fd, buf, sizeof(buf));
      bzero(buf, sizeof(buf));
     
      bzero(buf1, sizeof(buf1));
      if(read(fd, buf1, sizeof(buf1)));
          printf("receive %x from the serial\n", *buf1);
   
      close(fd);
      printf("close serial port\n");
     
    }
    }
    if(2 == i)
    {
      int fd, nwrite;
      char buf[2] = {0x02,0x02};
      unsigned int buf1[8];
      struct termios oldtio;
  
      QMessageBox msgBox2;
      msgBox2.setText(tr("MAKE SURE"));
      msgBox2.setIconPixmap(QPixmap("./456.jpg"));
      msgBox2.setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel);
      msgBox2.setDefaultButton(QMessageBox::Ok);
      int ret2 = msgBox2.exec();
 
      fd = open(DEVICE, O_RDWR | O_NOCTTY);
      printf("open serial success!\nfd = %d\n",fd);
      if(fd < 0)
    {
      perror(DEVICE);
      exit(1);
    }
      tcgetattr(fd, &oldtio);
      set_nc_mode(fd);
      printf("Change to nc mode\n");
     
      if(ret2 == QMessageBox::Ok)
      {
 
      nwrite = write(fd, buf, sizeof(buf));
      bzero(buf, sizeof(buf));
      bzero(buf1, sizeof(buf1));      
      if(read(fd, buf1, sizeof(buf1)));
      printf("receive %x from the serial\n", *buf1);
      
      close(fd);
      printf("close serial port\n");
      }
    }