QWinEventNotifier: Cannot have more than 62 enabled at one time



  • Good Day!

    I have the below code. Somewhere along the line after about 440 or so of the processes have run and dutifully deleted by the DeleteFProcess function after they finished, I get the eror in the subject line and memory starts filling up. I believe that I am policing everything and have never run into this error before. I had more information but I can only post 6000 characters...

    Any thoughts?

    -Jason

    @
    #include "mainwindow.h"
    static inline qint32 ArrayToInt(QByteArray source);

    MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
    {
    strData="";
    index = 0;
    server = new QTcpServer(this);
    connect(server, SIGNAL(newConnection()), SLOT(newConnection()));
    connect(this,SIGNAL(dataReceived(QByteArray)), this, SLOT(getData(QByteArray)));
    }

    void MainWindow::start(QString filename, QString params, bool stretch, int t, int x1, int y1, int x2, int y2)
    {

    ContentProcess *fp = new ContentProcess();
    fp->setStartTime(QDateTime::currentMSecsSinceEpoch());

    QStringList arguments;
    arguments << filename << params << QString(stretch ? "true" : "false")
    << QString::number(x1) << QString::number(y1) << QString::number(x2) << QString::number(y2)
    << QString::number(t);
    fp->setArguments(arguments);
    fp->setProgram("fp.exe");
    fp->setObjectName(QString::number(index));
    fpHash.insert(index,fp);
    index++;
    connect(fp, SIGNAL(error(QProcess::ProcessError)), this, SLOT(restartFProcess(QProcess::ProcessError)));
    connect(fp, SIGNAL(finished(int)), this, SLOT(deleteFProcess()));
    fp->start();
    }

    void MainWindow::restartFProcess(QProcess::ProcessError err)
    {
    ContentProcess fp = static_cast<ContentProcess>(sender());

    QStringList procargs = fp->arguments();
    fp->disconnect();
    fp->close();

    fpHash.remove(fp->objectName().toInt());

    delete fp;
    fp = 0;
    fp = new ContentProcess();

    int oldt = procargs.last().toInt();
    int newt = oldt - ((int)(QDateTime::currentMSecsSinceEpoch() - fp->getStartTime()));
    procargs.removeLast();
    procargs << QString::number(newt);

    fp->setArguments(procargs);

    fp->setProgram("fp.exe");
    fp->setObjectName(QString::number(index));
    fpHash.insert(index, fp);
    index++;

    connect(fp, SIGNAL(error(QProcess::ProcessError)),this, SLOT(restartFProcess(QProcess::ProcessError)));
    connect(fp, SIGNAL(finished(int)), this, SLOT(deleteFProcess()));

    fp->start();
    }

    void MainWindow::deleteFProcess()
    {
    ContentProcess fp = static_cast<ContentProcess>(sender());
    fpHash.remove(fp->objectName().toInt());
    fp->deleteLater();
    }

    void MainWindow::killAll()
    {
    foreach(ContentProcess *fproc, fpHash) {
    int ind = fproc->objectName().toInt();
    fpHash.remove(ind);
    fproc->disconnect();
    fproc->close();
    fproc->deleteLater();
    }
    }

    void MainWindow::newConnection()
    {
    while (server->hasPendingConnections())
    {
    QTcpSocket *skt = server->nextPendingConnection();
    connect(skt, SIGNAL(readyRead()), SLOT(readyRead()));
    connect(skt, SIGNAL(disconnected()), SLOT(disconnected()));
    QByteArray *bfr = new QByteArray();
    qint32 *s = new qint32(0);
    bfrs.insert(skt, bfr);
    sizes.insert(skt, s);
    }
    }
    void MainWindow::disconnected()
    {
    QTcpSocket skt = static_cast<QTcpSocket>(sender());
    QByteArray *bfr = bfrs.value(skt);
    qint32 *s = sizes.value(skt);
    bfrs.remove(skt);
    sizes.remove(skt);
    skt->deleteLater();
    delete bfr;
    delete s;
    }

    void MainWindow::readyRead()
    {
    QTcpSocket skt = static_cast<QTcpSocket>(sender());
    QByteArray *bfr = bfrs.value(skt);
    qint32 *s = sizes.value(skt);
    qint32 size = *s;
    while (skt->bytesAvailable() > 0)
    {
    bfr->append(skt->readAll());

       while ((size == 0 && bfr->size() >= 4) || (size > 0 && bfr->size() >= size)) //While can process data, process it
       {
           if (size == 0 && bfr->size() >= 4) //if size of data has received completely, then store it on our global variable
           {
               size = ArrayToInt(bfr->mid(0, 4));
               *s = size;
               bfr->remove(0, 4);
           }
           if (size > 0 && bfr->size() >= size) // If data has received completely, then emit our SIGNAL with the data
           {
               QByteArray data = bfr->mid(0, size);
               bfr->remove(0, size);
               size = 0;
               *s = size;
               emit dataReceived(data);
           }
       }
    

    }
    }

    void MainWindow::getData(QByteArray data){
    strData = data;
    QString fileName="";
    QString params="";
    QString stretch="";
    int x1=0;
    int y1=0;
    int x2=0;
    int y2=0;
    int t=0;

    QStringList slst = strData.split("#");
    if(slst.length() == 1) {
    if(slst.first().compare("KILL", Qt::CaseSensitive) == 0) {
    this->killAll();
    return;
    }
    }
    if(slst.length()<=8){
    fileName = slst.value(0);
    params = slst.value(1);
    stretch = slst.value(2);
    x1 =slst.value(3).toInt();
    y1 =slst.value(4).toInt();
    x2 = slst.value(5).toInt();
    y2 = slst.value(6).toInt();
    t = slst.value(7).toInt();
    }

    this->start(fileName,params,(stretch.compare("true", Qt::CaseInsensitive) == 0),t, x1, y1, x2, y2);
    }

    qint32 ArrayToInt(QByteArray source)
    {
    qint32 temp;
    QDataStream data(&source, QIODevice::ReadWrite);
    data >> temp;
    return temp;
    }
    @


  • Lifetime Qt Champion

    Hi,

    The use of static_cast is wrong in this case, you should use qobject_cast.

    I see you are allocating QByteArrays on the heap which is unusual, why are you doing it like that ?

    Can you show your ContentProcess implementation ?



  • My apologies, that was part of the extra information that I had to cull to get it down under 6k characters.

    ContentProcess simply extends QProcess and adds an extra couple of data items that I want to keep around. here is the header.

    @
    #ifndef CONTENTPROCESS_H
    #define CONTENTPROCESS_H

    #include <QProcess>

    class ContentProcess : public QProcess
    {
    Q_OBJECT
    public:
    explicit ContentProcess(QObject *parent = 0);
    void setStartTime(qlonglong time) {startTime = time;}
    qlonglong getStartTime() {return startTime;}
    int getDuration() {return duration;}
    void setDuration(int dur) {duration = dur;}

    private:
    qlonglong startTime;
    int duration;

    signals:

    public slots:

    };

    #endif // CONTENTPROCESS_H
    @

    As far as the QByteArrays go, I did not write that particular piece of the code. So, not sure.

    For the casts -- whoops. I meant to change that before posting.

    Thanks for looking!


  • Lifetime Qt Champion

    Looks correct.

    If you have access to it, you should take a look. You rarely need to allocate QByteArray like that.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.