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 13.8k 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.
  • 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