1
In my project I have a Main responsible for executing a QThread and on this wheel a QProcess responsible for creating a postgresql backup file.
Well the main works properly by calling the QThread which also works by creating and running QProcess, thus creating the archive.
But I need to know when the process ends, so I created a connect with a Signal already existing in the QProces" by name finished, this one that has as SLOT created by me, but this Signal is never called I wonder if there is something wrong in mine(which I have already reviewed several times), or if it is not possible to use this Signal in a QThread.
Any hint is welcome. Thank you.
Follows the code:
Threadpgdump. h:
 #ifndef THREADPGDUMP_H
 #define THREADPGDUMP_H
 #include "QObject"
 #include "QThread"
 #include "QString"
 #include "QProcess
class ThreadPgDump : public QThread{
      Q_OBJECT
   public:
      explicit ThreadPgDump(QObject *parent = 0);
      ~ThreadPgDump();
      //---------------------------------
      // SET
       void setPgDumpPath(QString pgDumpPath) { this->hostName = pgDumpPath; }
       void setParameters(
           QString hostName,
           QString databaseName,
           int port,
           QString username,
           QString password,
           QString backupPathFileName)
       {
           this->hostName = hostName;
           this->databaseName = databaseName;
           this->port = port;
           this->username = username;
           this->password = password;
           this->backupPathFileName = backupPathFileName;
       }
       void kill();
   private:
       QString  pgDumpPath;
       QString  hostName;
       QString  databaseName;
       int      port;
       QString  username;
       QString  password;
       QString  backupPathFileName;
       QProcess *process;
       //---------------------------------
       // FUNC
       bool procDefineEnvironment();
       QString getPgDump();
   protected:
       void run();
   signals:
       void finishedPgDump();
   public slots:
       void slotProgressFinished(int);
};
 #endif // THREADPGDUMP_H
Threadpgdump.cpp:
 #include "ThreadPgDump.h"
 #include "qdebug.h"
 #include "QProcess"
//-----------------------------------------------------------------------------
ThreadPgDump::ThreadPgDump(QObject *parent) : QThread(parent){
}
//-----------------------------------------------------------------------------
ThreadPgDump::~ThreadPgDump(){
}
//-----------------------------------------------------------------------------
void ThreadPgDump::run(){
    process = new QProcess(this->parent());
    connect(process, SIGNAL(finished(int)), this, SLOT(slotProgressFinished(int)));
    procDefineEnvironment();
    QString command;
    command.clear();
    command.append(getPgDump());
    command.append("--host ").append(hostName).append(" ");
    command.append("--port ").append(QString().sprintf("%d", port)).append(" ");
    command.append("--username \"").append(username).append("\" ");
    command.append("--format custom ");
    command.append("--blobs ");
    command.append("--verbose ");
    command.append("--file \"").append(backupPathFileName).append("\" ");
    command.append("\"").append(databaseName).append("\"");
    process->start(command);
}
//-----------------------------------------------------------------------------
QString ThreadPgDump::getPgDump(){
     if( pgDumpPath.length() > 0 ){
         return pgDumpPath;
     }
     else{
         #ifdef __linux__
             return QString("/usr/bin/pg_dump ");
         #endif
         #ifdef WIN32
             return QString("c:/pg_dump.exe ");
         #endif
     }
}
//-----------------------------------------------------------------------------
 void ThreadPgDump::kill(){
     if( process != NULL ){
         process->kill();
     }
}
//-----------------------------------------------------------------------------
bool ThreadPgDump::procDefineEnvironment(){
     QStringList env = QProcess::systemEnvironment();
     env.append(QString("PGPASSWORD=").append(password));
     process->setEnvironment(env);
     process->setProcessChannelMode(QProcess::MergedChannels);
     return true;
}
//-----------------------------------------------------------------------------
void ThreadPgDump::slotProgressFinished(int exitNumber){
    qDebug() << "TESTE";
}
//-----------------------------------------------------------------------------