Seite 1 von 1

Qt-Applikation ruckelt

Verfasst: 25. Juli 2012 15:19
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!

Re: Qt-Applikation ruckelt

Verfasst: 25. Juli 2012 22:37
von harry_m
Ich hätte diesen Prozess in ein Thread ausgelagert...

Re: Qt-Applikation ruckelt

Verfasst: 25. Juli 2012 23:24
von Woodfighter
Danke für die Antwort!
Das habe ich bereits versucht und es hat nichts geändert.

Re: Qt-Applikation ruckelt

Verfasst: 26. Juli 2012 08:18
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.)

Re: Qt-Applikation ruckelt

Verfasst: 26. Juli 2012 12:43
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.

Re: Qt-Applikation ruckelt

Verfasst: 26. Juli 2012 13:49
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.

Re: Qt-Applikation ruckelt

Verfasst: 26. Juli 2012 15:56
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?

Re: Qt-Applikation ruckelt

Verfasst: 26. Juli 2012 17:07
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.

Re: Qt-Applikation ruckelt

Verfasst: 27. Juli 2012 09:25
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?

Re: Qt-Applikation ruckelt

Verfasst: 28. Juli 2012 16:57
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!

Re: Qt-Applikation ruckelt

Verfasst: 30. Juli 2012 09:30
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.

Re: Qt-Applikation ruckelt

Verfasst: 1. August 2012 16:53
von harry_m
@Woodfighter:

hat es jetzt funktioniert? Wenn ja: was war das Problem? Würde mich sehr interessieren.

Re: Qt-Applikation ruckelt

Verfasst: 6. August 2012 17:56
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.