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

Tail-f function in qt

Scheduled Pinned Locked Moved General and Desktop
32 Posts 7 Posters 13.8k Views
  • 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.
  • T Offline
    T Offline
    tzander
    wrote on last edited by
    #15

    Your beginning idea was that you want to update whenever something new is written by the first program.
    A fifo can do that, but indeed its a bit tricky.
    The basic concept behind the fifo is that its blocking. So your code that reads from the fifo will never return. Not untill you delete the fifo, at least.

    As such you likely want to run the read in a different thread and make it notify the main gui thread whenever a new line was successfully read.
    It also means you never close the file.

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

      Hi Thomas...
      fifo was giving some problems..so used pipe...in terminal i open my gui executable with tail command.
      i.e tail -f alert.csv | ./mygui

      i am getting all the values in console using qdebug...but mygui is freezing and displaying nothing.... any idea?
      @QTableWidgetItem *item;
      int row=0,column=0;
      MainWindow::MainWindow(QWidget *parent) :
      QMainWindow(parent),
      ui(new Ui::MainWindow)
      {
      ui->setupUi(this);
      ui->alertshow->setColumnWidth(0,200);
      ui->alertshow->setColumnWidth(1,250);
      }

      MainWindow::~MainWindow()
      {
      delete ui;
      }

      void MainWindow::on_update_clicked()
      {
      QString line;

      QTextStream in(stdin);
      do
      {
          qDebug()<<"inside while";
       line = in.readLine();
       qDebug()<<line;
       QString delimiterPattern(",");
       QStringList fonts = line.split(delimiterPattern);
      
       qDebug() <<"fonts"<< fonts;
       display(fonts);
        
      }while(!line.isNull());
      
      qDebug()<<"outside";
      

      }

      void MainWindow::display(QStringList list)
      {
      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++;
      }
      }
      @

      1 Reply Last reply
      0
      • 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