Qt-Applikation ruckelt

Alles rund um die Programmierung mit Qt
Antworten
Woodfighter
Beiträge: 9
Registriert: 6. Juli 2012 21:09

Qt-Applikation ruckelt

Beitrag von Woodfighter »

Hallo,

wie schon in der Überschrift erwähnt, läuft mein Qt-Programm ruckelig bei der Ausführung.
In meinem Programm lasse ich mir über TCP-Sockets jede Sekunde ein Bild schicken, damit es auf der empfangenden Seite in einem QLabel angezeigt werden kann.
Das Bild wird als PNG gespeichert.
Führe ich das Programm unter Windows aus und lasse mir die BIlder senden, ruckelt das Fenster wenn ich es verschieben möchte und auch Tastatureingaben verzögern sich.
Unter Linux tritt dieses Problem nicht auf.
Neue Daten nehme ich so entgegen:

Code: Alles auswählen

void Action::handleNewData()
{
    if(this->m_sizeToRead == -1)
    {
        if(this->m_client->getClientSocket()->bytesAvailable() >= (qint64)sizeof(qint64))
        {
            this->m_sizeToRead = (*(qint64*)this->m_client->getClientSocket()->read(sizeof(qint64)).data());
        }
        else
        {
            return;
        }
    }

    if(this->m_headerBuffer.size() == 0)
    {
        if(this->m_client->getClientSocket()->bytesAvailable() >= 6)
        {
            this->m_headerBuffer += this->m_client->getClientSocket()->read(6);
        }
        else
        {
            return;
        }
    }

    qint64 residual = this->m_sizeToRead - this->m_readBuffer.size();
    this->m_readBuffer += this->m_client->getClientSocket()->read(residual);

    if(this->m_readBuffer.size() == this->m_sizeToRead)
    {
        Data* newData = new Data();
        newData->setHeader(this->m_headerBuffer);
        newData->setDataBuffer(this->m_readBuffer);
        this->m_readDataStorage.push_back(newData);
        this->m_sizeToRead = -1;
        this->m_readBuffer.clear();
        this->m_headerBuffer.clear();
        emit this->newData(newData);
        emit this->hasNewData(this->m_client);
    }
}
Vielen Dank für die Hilfe!
harry_m
Beiträge: 74
Registriert: 26. April 2010 23:16

Re: Qt-Applikation ruckelt

Beitrag von harry_m »

Ich hätte diesen Prozess in ein Thread ausgelagert...
Zwei Tragödien gibt es im Leben: die eine - nicht zu bekommen, was das Herz wünscht, und die andere: es doch zu bekommen. (Oscar Wilde)
Woodfighter
Beiträge: 9
Registriert: 6. Juli 2012 21:09

Re: Qt-Applikation ruckelt

Beitrag von Woodfighter »

Danke für die Antwort!
Das habe ich bereits versucht und es hat nichts geändert.
harry_m
Beiträge: 74
Registriert: 26. April 2010 23:16

Re: Qt-Applikation ruckelt

Beitrag von harry_m »

Was ist es denn für eine Hardware? Haben der Linux- und der Windows Rechner ähnliche Leistung?

Dur schreibst, dass das Bild als .PNG gespeichert wird. Versuche einfach mal das Speichern der Bilder "heraus zu kommentieren": ob es danach immer noch ruckelt? - Vielleicht ist es nicht die Übertragung, sondern das Speichern der Bilder, das Probleme verursacht? (Ich grübelte gestern Abend noch darüber nach und es kommt mir jetzt als sehr wahrscheinlich vor.)
Zwei Tragödien gibt es im Leben: die eine - nicht zu bekommen, was das Herz wünscht, und die andere: es doch zu bekommen. (Oscar Wilde)
Woodfighter
Beiträge: 9
Registriert: 6. Juli 2012 21:09

Re: Qt-Applikation ruckelt

Beitrag von Woodfighter »

Der PC, auf dem Windows läuft, hat sogar bessere Hardware.

Folgendermaßen speichere und sende ich das Bild:

Code: Alles auswählen

    QPixmap snapshot = QPixmap::grabWindow(QApplication::desktop()->winId()); //Screenshot wird als Pixmap gespeichert
    QByteArray snapshotToSend;
    QBuffer buffer(&snapshotToSend);
    buffer.open(QIODevice::WriteOnly);
    snapshot.save(&buffer, "PNG", 40); //Screenshot wird als PNG im Buffer gespeichert
    //Daten werden versendet
    this->m_client->performAction()->writeBuffer()->setHeader(QString("screen"));
    this->m_client->performAction()->writeBuffer()->setDataBuffer(snapshotToSend);
    this->m_client->performAction()->sendData();
Leider kenne ich keine Möglichkeit, das Bild zu übertragen, ohne es erst einmal in einem Buffer zu speichern.
harry_m
Beiträge: 74
Registriert: 26. April 2010 23:16

Re: Qt-Applikation ruckelt

Beitrag von harry_m »

Nimm doch das "::grabWindow()" heraus, lasse einfach ein bereits vorhandenes Bild immer wieder übertragen.

Gedanke dahinter: das Bild wird erst erstellt, dann gespeichert, dann gepuffert und dann übertragen... viel Aktionen auf der Festplatte. Vielleicht wird es gelingen, dadurch den "Übeltäter" einzugrenzen. Dann wissen wir genauer, wo der Hund begraben ist.

Hintergrund: ich habe zuletzt bei der Bearbeitung von .PNG Bildern Probleme bekommen (Qt 4.8.2). Mit .JPG hat es dagegen problemlos funktioniert. Und dabei ging es um eine so triviale Sache, wie Anpassung des Bildes an einen bestimmten Rahmen.
Zwei Tragödien gibt es im Leben: die eine - nicht zu bekommen, was das Herz wünscht, und die andere: es doch zu bekommen. (Oscar Wilde)
Markus
Beiträge: 105
Registriert: 31. Januar 2005 16:21

Re: Qt-Applikation ruckelt

Beitrag von Markus »

Code: Alles auswählen

    this->m_client->performAction()->sendData();
Ist das Programm auch langsam, wenn nichts übertragen wird? Und was passiert in der o.g. Funktion?
Woodfighter
Beiträge: 9
Registriert: 6. Juli 2012 21:09

Re: Qt-Applikation ruckelt

Beitrag von Woodfighter »

Das Programm läuft gut, wenn nichts übertragen wird.
So sende ich die Daten:

Code: Alles auswählen

void Action::sendData()
{
    qint64 dataSize = this->m_writeBuffer->getDataBuffer().size();
    qint64 *dataSizePtr = &dataSize;
    const char *charPtr = reinterpret_cast<const char*>(dataSizePtr);
    this->m_client->getClientSocket()->write(charPtr, sizeof(qint64));
    this->m_client->getClientSocket()->write(this->m_writeBuffer->getHeader(), 6);
    this->m_client->getClientSocket()->write(this->m_writeBuffer->getDataBuffer());
    this->m_client->getClientSocket()->flush();
}
Danke, Harry. Ich versuche das mal.
Markus
Beiträge: 105
Registriert: 31. Januar 2005 16:21

Re: Qt-Applikation ruckelt

Beitrag von Markus »

Woodfighter hat geschrieben:

Code: Alles auswählen

    this->m_client->getClientSocket()->write(this->m_writeBuffer->getDataBuffer());
Ich nehme mal an getClientSocket() liefert ein QTcpSocket-Objekt zurück, auf dem Du Deinen Buffer schreibst. Was in diesem Zusammenhang interessant ist, wie groß ist das Bild? Hast Du es schonmal in einer Datei gespeichert?
Woodfighter
Beiträge: 9
Registriert: 6. Juli 2012 21:09

Re: Qt-Applikation ruckelt

Beitrag von Woodfighter »

Ja, "getClientSocket()" liefert ein QTcpSocket zurück.
Es ist ca. 2 MB groß, wenn ich es speichere.

Bisher habe ich immer noch keine Lösung gefunden. Trotzdem danke für die Hilfe!
Markus
Beiträge: 105
Registriert: 31. Januar 2005 16:21

Re: Qt-Applikation ruckelt

Beitrag von Markus »

Wenn die Bild-Datei 2 MB gross ist, würde ich mal den Ansatz probieren, den Dateiinhalt stückweise (zB. 256KB) auf den Socket zu schieben und nach einem Schreiben ein processEvents() auszurufen, damit die Events der GUI/User verarbeitet werden.
harry_m
Beiträge: 74
Registriert: 26. April 2010 23:16

Re: Qt-Applikation ruckelt

Beitrag von harry_m »

@Woodfighter:

hat es jetzt funktioniert? Wenn ja: was war das Problem? Würde mich sehr interessieren.
Zwei Tragödien gibt es im Leben: die eine - nicht zu bekommen, was das Herz wünscht, und die andere: es doch zu bekommen. (Oscar Wilde)
Woodfighter
Beiträge: 9
Registriert: 6. Juli 2012 21:09

Re: Qt-Applikation ruckelt

Beitrag von Woodfighter »

Hallo und danke für die Antworten!

Konnte es bisher nicht probieren, weil ich zu Besuch bei meinen Eltern war und da nicht programmieren konnte ;-)
Ich melde mich wieder, wenn ich Ergebnisse habe.
Antworten