Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Tail-f function in qt
Forum Updated to NodeBB v4.3 + New Features

Tail-f function in qt

Scheduled Pinned Locked Moved General and Desktop
32 Posts 7 Posters 14.6k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #17

    Aren't you running the do while loop forever ?

    Try with line.isEmpty(), IIRC "" is empty but not null.

    Hope it helps

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    1 Reply Last reply
    0
    • T Offline
      T Offline
      tzander
      wrote on last edited by
      #18

      You switched to reading a pipe, but the actual problem is not with the fifo its that your method on_update_clicked() will never return.

      What you may not realize is that this means that the painting system will never do anything anymore, since its waiting for the on_update_clicked method to finish.

      So, I think the fifo was a great idea, I suggest using that again.

      I realize that threads are not easy, so let me suggest a different approach that will work too.
      You can modify your on_update_clicked to exit when there is no data to read. See QIODevice::canReadLine()

      If you get tired of pressing the button you might want to instead connect that slot up to the QIODevice::readyRead() signal from your input file.

      GOod luck!

      1 Reply Last reply
      0
      • D Offline
        D Offline
        devfeel
        wrote on last edited by
        #19

        Thanks SGaist...it didnt worked...

        And Thomas i tried with fifo also...same issue...I have attached the code yesterday...if possible check...I am working on readyread as u said...

        1 Reply Last reply
        0
        • D Offline
          D Offline
          devfeel
          wrote on last edited by
          #20

          The below code is giving error...can you please help
          @QTextStream in(stdin);
          QObject::connect(in, SIGNAL(readyRead()), this, SLOT(readcsv()));@

          error: no matching function for call to 'MainWindow::connect(QTextStream&, const char [13], MainWindow* const, const char [11])'

          1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #21

            QTextStream does not have a readyRead signal, QFile does (from QIODevice).

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            1 Reply Last reply
            0
            • D Offline
              D Offline
              devfeel
              wrote on last edited by
              #22

              Evn this is not working...its not entering readcsv()
              @ QFile file("alert.csv");

              file.open(QIODevice::ReadOnly | QIODevice::Text);

              QObject::connect(&file,SIGNAL(readyRead()),  SLOT(readcsv()));@
              
              1 Reply Last reply
              0
              • D Offline
                D Offline
                devfeel
                wrote on last edited by
                #23

                "qfile wont emit signals like qio":http://qt-project.org/doc/qt-4.8/qfile.html#signals

                1 Reply Last reply
                0
                • SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on last edited by
                  #24

                  Right ! I forgot about that.
                  Did you have a look at QSocketNotifier ? It might be what you need to monitor a pipe on unix.

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  1 Reply Last reply
                  0
                  • D Offline
                    D Offline
                    devfeel
                    wrote on last edited by
                    #25

                    thanks Sgaist
                    @ notifier = new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read);
                    connect(notifier, SIGNAL(activated(int)), this, SLOT(readcsv()));@

                    and used repaint() function in readcsv function...now gui is showing the contents ..but gui is still freezed...
                    any possible solution

                    1 Reply Last reply
                    0
                    • SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #26

                      Do you still have an infinite loop somewhere ?

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      0
                      • D Offline
                        D Offline
                        devfeel
                        wrote on last edited by
                        #27

                        hi sgaist...This is the code...only using while(!line.isEmpty());
                        have tried with isnull() also..but same
                        @void MainWindow::readcsv()
                        {
                        QString line;
                        //ui->alertshow->repaint();
                        qDebug()<<"in readcsv";
                        QTextStream in(stdin,QIODevice::ReadOnly);

                        do
                        {
                          // ui->alertshow->repaint();
                            qDebug()<<"inside while";
                         line = in.readLine();
                         qDebug()<<line;
                         QString delimiterPattern(",");
                         QStringList fonts = line.split(delimiterPattern);
                        
                         qDebug() <<"fonts"<< fonts;
                        
                         display(fonts);
                        
                        }while(!line.isEmpty());
                        
                        qDebug()<<"outside";
                        

                        }

                        void MainWindow::display(QStringList list)
                        {
                        ui->alertshow->repaint();
                        for(int i=0;i<list.count();i++)
                        {

                        QString li=list[i];
                        qDebug()<<"csv"<<li;
                        item=new QTableWidgetItem(li);
                        ui->alertshow->setItem(row,column,item);
                        column++;
                        }
                        // ui->alertshow->repaint();
                        }
                        @

                        1 Reply Last reply
                        0
                        • SGaistS Offline
                          SGaistS Offline
                          SGaist
                          Lifetime Qt Champion
                          wrote on last edited by
                          #28

                          Wild idea (i don't have *nix system right now at hand)

                          Why don't you do a readAll() and then parse the lines from that ?

                          Interested in AI ? www.idiap.ch
                          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                          1 Reply Last reply
                          0
                          • clogwogC Offline
                            clogwogC Offline
                            clogwog
                            wrote on last edited by
                            #29

                            Not sure if you would be interested, but I have abit of code that starts a tail -f as a QProcess and just redirects the output of that process to a QLineEdit

                            It's not hard to do, let me know and ill lookup the snippet when I get back at work on Monday.

                            Cheers

                            1 Reply Last reply
                            0
                            • D Offline
                              D Offline
                              devfeel
                              wrote on last edited by
                              #30

                              Thanks clogwog...It would be very helpful if u provide the snippet.
                              [quote author="clogwog" date="1362136280"]Not sure if you would be interested, but I have abit of code that starts a tail -f as a QProcess and just redirects the output of that process to a QLineEdit

                              It's not hard to do, let me know and ill lookup the snippet when I get back at work on Monday.

                              Cheers[/quote]

                              1 Reply Last reply
                              0
                              • clogwogC Offline
                                clogwogC Offline
                                clogwog
                                wrote on last edited by
                                #31

                                header:

                                @myclass
                                {
                                startFollowingTail();

                                private:

                                QProcess procTail;

                                private slot:
                                void readFromStdoutForTail();
                                }@

                                in constructor:

                                @myclass::myclass() : ..... , procTail(this)
                                {
                                connect( &procTail, SIGNAL(readyReadStandardOutput()),this, SLOT(readFromStdoutForTail()) );
                                }

                                myclass::startFollowingTail()
                                {
                                if( procTail.Running)
                                procTail.kill();

                                        QStringList alist;
                                        alist << "-f" << "/tmp/software_update.log";
                                        procTail.start("/usr/bin/tail", alist, QIODevice::ReadWrite);
                                

                                }

                                void myclass::readFromStdoutForTail()
                                {
                                while ( procTail.canReadLine())
                                {
                                QByteArray a = procTail.readLine();
                                QString data = a.data();
                                ui->plainTextEdit->insertPlainText(data);
                                // scroll to end
                                ui->plainTextEdit->verticalScrollBar()->setValue(ui->plainTextEdit->verticalScrollBar()->maximum());
                                }
                                }@

                                1 Reply Last reply
                                0
                                • U Offline
                                  U Offline
                                  Ulatekh
                                  wrote on last edited by
                                  #32

                                  I've only tested this on Linux (Fedora Core 16) and Qt 4.8.4, but this worked like "tail -f" for me:

                                  @volatile bool shutdown = false;
                                  QTextStream textStream;

                                  void tailFollow()
                                  {
                                  while (!shutdown)
                                  {
                                  if (textStream.atEnd())
                                  QThread::sleep (1);
                                  else
                                  {
                                  QString line = textStream.readLine();
                                  // Do something with line here...
                                  }
                                  }
                                  }@

                                  In the actual code, "shutdown" and "textStream" were member variables of a QThread subclass, and tailFollow() was a method on that QThread subclass. The client would set "shutdown" to true when the loop should exit.

                                  1 Reply Last reply
                                  0

                                  • Login

                                  • Login or register to search.
                                  • First post
                                    Last post
                                  0
                                  • Categories
                                  • Recent
                                  • Tags
                                  • Popular
                                  • Users
                                  • Groups
                                  • Search
                                  • Get Qt Extensions
                                  • Unsolved