Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-126999

activateWindow will cause system crash in freebsd

    XMLWordPrintable

Details

    Description

      I run the program lock screen rest some month found this bug.I have compile the code use qt5.15.13 and qt6.7.1 the two version have same bug.

      sometime run activateWindow in freebsd system will die. I have restart freebsd many times by this bug.

       

      I try to move activateWIndow function to outside ontimer. but it always make system can not use mouse and  keyboard.

      this is the code:

      #include "mainwindow.h"
      #include "./ui_mainwindow.h"
      #include <QFile>
      #include <QSystemSemaphore>
      #include <QDateTime>
      #include <QInputDialog>
      #include <QCloseEvent>
      #include <QList>
      #include <QRegularExpression>

      struct TimeDef

      {     QString def;     QString lock; //lock or unlock;     int    begin_hour;     int    begin_minute;     int    end_hour;     int    end_minute;     int    beginsecs;     int    endsecs; }

      ;
      QList<TimeDef*> allDef;
      QString xxminute="";
      int alwaysshow = 0;
      QString password;
      int fullscreen=0;
      int maxscreen=1;
      int keyboardallow = 1;
      int alpha = 200;
      int hotkeyallow = 1;

      MainWindow::MainWindow(QWidget *parent)
          : QMainWindow(parent)
          , ui(new Ui::MainWindow)
      {
          ui->setupUi(this);

       

       

          QFile ff("LockScreenRest.conf");
          QString ffctt;
          if(ff.exists()==false)

      {         ff.open(QFile::OpenModeFlag::ReadWrite);         auto buf = "#help\n#maxscreen=1\n#fullscreen=1\n#password=\n#hotkey=Ctrl+Shift+Alt+X\n#keyboardallow=1\n#hotkeyallow=1\n#alpha=200\n#lock|unlock hour:minute-hour:minute\nlock 00:00-07:00\nunlock 07:00-07:50\nlock 07:50-08:00\nunlock 08:00-08:50\nlock 08:50-09:00\nunlock 09:00-09:50\nlock 09:50-10:00\nunlock 10:00-10:50\nlock 10:50-11:00\nunlock 11:00-11:50\nlock 11:50-13:00\nunlock 13:00-13:50\nlock 13:50-14:00\nunlock 14:00-14:50\nlock 14:50-15:00\nunlock 15:00-15:50\nlock 15:50-16:00\nunlock 16:00-16:50\nlock 16:50-17:00\nunlock 17:00-17:50\nlock 17:50-18:00\nunlock 18:00-18:50\nlock 18:50-19:00\nunlock 19:00-19:50\nlock 19:50-21:00\nunlock 21:00-21:50\nlock 21:50-22:00\nunlock 22:00-22:50\nlock 22:50-23:00\nunlock 23:00-23:50\nlock 23:50-24:00\n\n\n\n\n";         ff.write(buf);         ffctt=buf;         ff.close();     }

      else

      {         ff.open(QFile::OpenModeFlag::ReadOnly);         auto bs=ff.readAll();         ffctt=bs;         ff.close();     }

          QStringList sslis=ffctt.split(QRegularExpression("[\r\n]",QRegularExpression::DotMatchesEverythingOption|QRegularExpression::CaseInsensitiveOption|QRegularExpression::MultilineOption));

          QString hotkey="X";

          for (int si=0;si<sslis.size();si+=1) {
              auto lin=sslis[si].trimmed();
              if (lin.size() > 0) {
                  if (lin[lin.size() - 1] == '\r')

      {                 lin = lin.mid(0, lin.size() - 1);             }

                  if (lin.size() > 0 && lin[0] != '#' && lin.indexOf("lock ")!=1 && lin.indexOf('')!=-1 && lin.indexOf(':')!=-1 && (lin.size()==16 || lin.size()==18))

      {                 //lin format:lock hour:minute-hour:minute                 TimeDef *td = new TimeDef;                 td->def=lin.mid(lin.indexOf(' ')+1);                 td->lock = lin.mid(0, lin.indexOf(' '));                 auto sp = lin.indexOf(' ');                 auto slashp = lin.indexOf('-');                 auto slashppre = lin.mid(sp+1, slashp-(sp+1));                 auto slashpaft = lin.mid(slashp + 1);                 auto slashpprep = slashppre.indexOf(':');                 auto slashpaftp = slashpaft.indexOf(':');                 td->begin_hour = slashppre.mid(0, slashpprep).toInt();                 td->begin_minute = slashppre.mid(slashpprep + 1).toInt();                 td->beginsecs = td->begin_hour * 3600 + td->begin_minute * 60;                 td->end_hour = slashpaft.mid(0, slashpaftp).toInt();                 td->end_minute = slashpaft.mid(slashpaftp + 1).toInt();                 td->endsecs = td->end_hour * 3600 + td->end_minute * 60;                 allDef.push_back(td);             }

                  else if (lin.indexOf("=") != -1 &&  lin.mid(0, lin.indexOf("=")+1) == "#hotkey=")

      {                 hotkey = lin.mid(lin.indexOf("=")+1);             }

      else if (lin.indexOf("=")!=-1 && lin.mid(0, lin.indexOf("=") + 1) == "#keyboardallow=")

      {                 keyboardallow = lin.mid(lin.indexOf("=") + 1).toInt();             }

                  else if (lin.indexOf("=")!=-1 && lin.mid(0, lin.indexOf("=")+1) == "#alpha=")

      {                 alpha = lin.mid(lin.indexOf("=")+ 1).toInt();             }

      else if (lin.indexOf("=")!=-1 && lin.mid(0, lin.indexOf("=")+1) == "#hotkeyallow=")

      {                 hotkeyallow = lin.mid(lin.indexOf("=")+ 1).toInt();             }

      else if (lin.indexOf("=") != -1 &&  lin.mid(0, lin.indexOf("=")+1) == "#password=")

      {                 password = lin.mid(lin.indexOf("=")+1);             }

      else if (lin.indexOf("=") != -1 &&  lin.mid(0, lin.indexOf("=")+1) == "#fullscreen=")

      {                 fullscreen = lin.mid(lin.indexOf("=")+ 1).toInt();             }

      else if (lin.indexOf("=") != -1 &&  lin.mid(0, lin.indexOf("=")+1) == "#maxscreen=")

      {                 maxscreen = lin.mid(lin.indexOf("=")+ 1).toInt();             }

              }
          }

          connect(this,SIGNAL(showui(QString,int,int)),this,SLOT(Showui(QString,int,int)));
          connect(this,SIGNAL(showui2(QString,int,int)),this,SLOT(Showui2(QString,int,int)));
          connect(this,SIGNAL(hideui(QString,int,int)),this,SLOT(Hideui(QString,int,int)));
          connect(this,SIGNAL(hideui2(QString,int,int)),this,SLOT(Hideui2(QString,int,int)));

          connect(&locktimer,SIGNAL(timeout()),this,SLOT(locktimer_timeout()));
          locktimer.start(10000);
      }

      extern QSystemSemaphore semap;
      MainWindow::~MainWindow()

      {     // 完成任务后释放信号量     semap.release(1);     delete ui; }

      void MainWindow::Showui(QString def,int beginsecs,int endsecs){
          if(this->isHidden()){
              if(maxscreen==1){
                  if(this->isHidden() || this->isMaximized()==false)

      {                 this->showMaximized();             }

              }else if(fullscreen==1){             this->showFullScreen();         }else{             this->showNormal();         }
              this->activateWindow();
              //this->setWindowFlag(Qt::WindowStaysOnTopHint);
          }else{         this->activateWindow();     }
          QString minutenum=QString("%1").arg((endsecs - beginsecs) / 60);
          ui->msgl->setText("Take A Rest "+minutenum +" Minute");
          QDateTime dt=QDateTime::currentDateTime();
          auto curts=dt.toString("yyyy-MM-ddThh:mm:ss");
          ui->resttime->setText(QString("Rest time:")def"    Now:"+curts);

      }

       

      void MainWindow::Showui2(QString def,int beginsecs,int endsecs){
          if(this->isHidden()){
              if(maxscreen==1)

      {             if(this->isHidden() || this->isMaximized()==false)\{                 this->showMaximized();             }

              }else if(fullscreen==1)

      {             this->showFullScreen();         }

      else

      {             this->showNormal();         }

              this->activateWindow();
              //this->setWindowFlag(Qt::WindowStaysOnTopHint);
          }else

      {         this->activateWindow();     }

          QString minutenum=QString("%1").arg((endsecs - beginsecs) / 60);
          ui->msgl->setText("Alt+F4 Close Window For Working "+minutenum +" Minutes");
          QDateTime dt=QDateTime::currentDateTime();
          auto curts=dt.toString("yyyy-MM-ddThh:mm:ss");
          ui->resttime->setText(QString("Now work time:")def"    Now:"+curts);
      }

       

      void MainWindow::Hideui(QString def,int beginsecs,int endsecs){
          this->hide();
          xxminute = "";
          //if (this->isHidden()==false)

      {     ui->msgl->setText("Alt+F4 Close Window For Working");     QDateTime dt=QDateTime::currentDateTime();     auto curts=dt.toString("yyyy-MM-ddThh:mm:ss");     ui->resttime->setText(QString("Now work time:")+def+"    Now:"+curts);     //}

      }

       

      void MainWindow::Hideui2(QString def,int beginsecs,int endsecs){
          this->hide();
          xxminute = "";
          //if (this->isHidden()==false)

      {     QString minutenum=QString("%1").arg((endsecs - beginsecs) / 60);     ui->msgl->setText("Take A Rest "+minutenum +" Minute");     QDateTime dt=QDateTime::currentDateTime();     auto curts=dt.toString("yyyy-MM-ddThh:mm:ss");     ui->resttime->setText(QString("Rest time:")+def+"    Now:"+curts);     //}

      }

       

      bool unlockuntilnextunlock=false;
      bool lockuntiluserclose=false;

      void MainWindow::locktimer_timeout()
      {
          if (allDef.size() == 0) {
              if (this->isMaximized())

      {             ui->msgl->setText("Empty Time List!");             this->activateWindow();         }

          }else {
              time_t now;
              time(&now);
              auto date = localtime(&now);
              auto cursecs = date->tm_hour * 3600 + date->tm_min * 60;
              for (int i = 0; i < allDef.size(); i += 1) {
                  auto it = allDef[i];
                  if (cursecs >= it->beginsecs && cursecs < it->endsecs) {
                      if (it->lock == "lock") {
                          if(QFile::exists("ShowOnce"))

      {                         QFile::remove("ShowOnce");                         lockuntiluserclose=true;                     }

                          if(lockuntiluserclose){
                              //this->setFocus();
                              //this->showNormal();
                              //this->setFocus();
                              emit showui(allDef[i]>def,allDef[i]>beginsecs,allDef[i]->endsecs);
                              break;
                              if(this->isHidden()){
                                  if(maxscreen==1){
                                      if(this->isHidden() || this->isMaximized()==false)

      {                                     this->showMaximized();                                 }

                                  }else if(fullscreen==1){                                 this->showFullScreen();                             }else{                                 this->showNormal();                             }
                                  this->activateWindow();
                                  //this->setWindowFlag(Qt::WindowStaysOnTopHint);
                              }else{                             this->activateWindow();                         }
                              QString minutenum=QString("%1").arg((it->endsecs - it->beginsecs) / 60);
                              ui->msgl->setText("Take A Rest "+minutenum +" Minute");
                              QDateTime dt=QDateTime::currentDateTime();
                              auto curts=dt.toString("yyyy-MM-ddThh:mm:ss");
                              ui->resttime->setText(QString("Rest time:")allDef[i]->def"    Now:"+curts);
                              break;
                          }
                          if(unlockuntilnextunlock){                         emit hideui2(allDef[i]>def,allDef[i]>beginsecs,allDef[i]>endsecs);                         break;                         //this>hide();                     }else{
                              //this->setFocus();
                              //this->showNormal();
                              //this->setFocus();
                              emit showui(allDef[i]>def,allDef[i]>beginsecs,allDef[i]->endsecs);
                              break;
                              if(this->isHidden()){
                                  if(maxscreen==1)

      {                                 if(this->isHidden() || this->isMaximized()==false)\{                                     this->showMaximized();                                 }

                                  }else if(fullscreen==1)

      {                                 this->showFullScreen();                             }

      else

      {                                 this->showNormal();                             }

                                  this->activateWindow();
                              }else

      {                             this->activateWindow();                         }

                              QString minutenum=QString("%1").arg((it->endsecs - it->beginsecs) / 60);
                              ui->msgl->setText("Take A Rest "+minutenum +" Minute");
                              QDateTime dt=QDateTime::currentDateTime();
                              auto curts=dt.toString("yyyy-MM-ddThh:mm:ss");
                              ui->resttime->setText(QString("Rest time:")allDef[i]->def"    Now:"+curts);
                              break;
                          }
                      }
                      else if (it->lock == "unlock") {
                          unlockuntilnextunlock=false;
                          if(QFile::exists("ShowOnce") || lockuntiluserclose){
                              QFile::remove("ShowOnce");
                              lockuntiluserclose=true;
                              emit showui2(allDef[i]>def,allDef[i]>beginsecs,allDef[i]->endsecs);
                              break;
                              if(maxscreen==1){
                                  if(this->isHidden() || this->isMaximized()==false)

      {                                 this->showMaximized();                             }

                              }else if(fullscreen==1)

      {                             this->showFullScreen();                         }

      else

      {                             this->showNormal();                         }

                              this->activateWindow();

                              ui->msgl->setText("Alt+F4 Close Window For Working");
                              QDateTime dt=QDateTime::currentDateTime();
                              auto curts=dt.toString("yyyy-MM-ddThh:mm:ss");
                              ui->resttime->setText(QString("Now work time:")(allDef[i]->def)"    Now:"+curts);
                          }else{

                              emit hideui(allDef[i]>def,allDef[i]>beginsecs,allDef[i]->endsecs);
                              break;
                              this->hide();
                              xxminute = "";
                              //if (this->isHidden()==false)

      {                         ui->msgl->setText("Alt+F4 Close Window For Working");                         QDateTime dt=QDateTime::currentDateTime();                         auto curts=dt.toString("yyyy-MM-ddThh:mm:ss");                         ui->resttime->setText(QString("Now work time:")+(allDef[i]->def)+"    Now:"+curts);                         //}

                          }
                          break;
                      }
                  }
              }
          }
      }

      void MainWindow::closeEvent(QCloseEvent *ce)
      {
          if(password!=""){
              QInputDialog idlg;
              idlg.setLabelText("Password");
              auto ipass=idlg.getText(this,"Input Close Password","Password:",QLineEdit::Password);
              if(ipass!=password)

      {             ce->ignore();             return;         }

          }
          lockuntiluserclose=false;
          unlockuntilnextunlock=true;
          this->hide();
          ce->ignore();
      }

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            srutledg Shawn Rutledge
            wlb Wlb Wlb
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:

              Gerrit Reviews

                There are no open Gerrit changes