QTcpSocket stream verarbeiten
QTcpSocket stream verarbeiten
Hallo allerseits,
ich versuche seit längerem eine MotionJPEG stream darzustellen, klappt eigentlich auch, aber ab und zu stürzt das Programm ab, ich habe immer mehr die Vermutung, dass es auf das QTcpSocket bzw. QHttp zurückzuführen ist
Kann es sein, dass wenn man öfters bitweise davon liest, dass der socket damit nicht zurechtkommt ?
tcp->read(&byte,1)
falls der interne puffer des socket leer sein sollte, stört dass meine algorithmus nicht, da ich abfrage, wieviel bytes tatsächlich gelesen worden sind. und so ggf. nochmal lese, nach eine kurzen pause
mfg Lukas
ich versuche seit längerem eine MotionJPEG stream darzustellen, klappt eigentlich auch, aber ab und zu stürzt das Programm ab, ich habe immer mehr die Vermutung, dass es auf das QTcpSocket bzw. QHttp zurückzuführen ist
Kann es sein, dass wenn man öfters bitweise davon liest, dass der socket damit nicht zurechtkommt ?
tcp->read(&byte,1)
falls der interne puffer des socket leer sein sollte, stört dass meine algorithmus nicht, da ich abfrage, wieviel bytes tatsächlich gelesen worden sind. und so ggf. nochmal lese, nach eine kurzen pause
mfg Lukas
Welche Qt-Version benutzt du? Laut Trolltech Task-Tracker gibts da schon einiges Bugs...
qt 4.2.0
Code: Alles auswählen
msvcr71d.dll!memcpy(unsigned char * dst=0x01310078, unsigned char * src=0xcdcdcdcd, unsigned long count=3452816845) Zeile 171 Asm
QtCored4.dll!QByteArray::realloc(int alloc=32768) Zeile 1360 + 0x1c C++
QtCored4.dll!QByteArray::detach() Zeile 345 + 0x3d C++
QtCored4.dll!QByteArray::data() Zeile 339 + 0xf C++
QtCored4.dll!QRingBuffer::reserve(int bytes=1460) Zeile 111 C++
QtNetworkd4.dll!QAbstractSocketPrivate::readFromSocket() Zeile 880 + 0x13 C++
QtNetworkd4.dll!QAbstractSocketPrivate::_q_canReadNotification() Zeile 488 + 0x8 C++
QtNetworkd4.dll!QAbstractSocket::qt_metacall(QMetaObject::Call _c=InvokeMetaMethod, int _id=14, void * * _a=0x0012d15c) Zeile 104 + 0xf C++
QtNetworkd4.dll!QTcpSocket::qt_metacall(QMetaObject::Call _c=InvokeMetaMethod, int _id=21, void * * _a=0x0012d15c) Zeile 56 + 0x14 C++
QtCored4.dll!QMetaObject::activate(QObject * sender=0x00ad4228, int from_signal_index=4, int to_signal_index=4, void * * argv=0x00000000) Zeile 2909 + 0x44 C++
QtCored4.dll!QMetaObject::activate(QObject * sender=0x00ad4228, const QMetaObject * m=0x6406a5b4, int local_signal_index=0, void * * argv=0x00000000) Zeile 2952 + 0x1b C++
QtNetworkd4.dll!QAbstractSocketEngine::readNotification() Zeile 79 + 0x13 C++
QtNetworkd4.dll!QAbstractSocketEngine::qt_metacall(QMetaObject::Call _c=InvokeMetaMethod, int _id=0, void * * _a=0x0012dac4) Zeile 67 + 0x8 C++
QtNetworkd4.dll!QNativeSocketEngine::qt_metacall(QMetaObject::Call _c=InvokeMetaMethod, int _id=4, void * * _a=0x0012dac4) Zeile 56 + 0x14 C++
QtCored4.dll!QMetaObject::activate(QObject * sender=0x00ad5878, int from_signal_index=4, int to_signal_index=4, void * * argv=0x0012dac4) Zeile 2909 + 0x44 C++
QtCored4.dll!QMetaObject::activate(QObject * sender=0x00ad5878, const QMetaObject * m=0x671cb6e0, int local_signal_index=0, void * * argv=0x0012dac4) Zeile 2952 + 0x1b C++
QtCored4.dll!QSocketNotifier::activated(int _t1=1644) Zeile 79 + 0x14 C++
QtCored4.dll!QSocketNotifier::event(QEvent * e=0x0012deb4) Zeile 275 C++
QtGuid4.dll!QApplicationPrivate::notify_helper(QObject * receiver=0x00ad5878, QEvent * e=0x0012deb4) Zeile 3433 + 0xf C++
QtGuid4.dll!QApplication::notify(QObject * receiver=0x00ad5878, QEvent * e=0x0012deb4) Zeile 3008 + 0x10 C++
QtCored4.dll!QCoreApplication::sendEvent(QObject * receiver=0x00ad5878, QEvent * event=0x0012deb4) Zeile 181 + 0x3f C++
QtCored4.dll!qt_internal_proc(HWND__ * hwnd=0x00070460, unsigned int message=1024, unsigned int wp=1644, long lp=1) Zeile 264 + 0xf C++
user32.dll!77d18734()
user32.dll!77d18816()
user32.dll!77d189cd()
ntdll.dll!7c925b4f()
ntdll.dll!7c925b4f()
user32.dll!77d18a10()
QtCored4.dll!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...}) Zeile 435 + 0x18 C++
QtGuid4.dll!QGuiEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...}) Zeile 928 + 0x15 C++
QtCored4.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...}) Zeile 124 C++
QtCored4.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...}) Zeile 169 + 0x2d C++
QtCored4.dll!QCoreApplication::exec() Zeile 718 + 0x15 C++
> QtGuid4.dll!QApplication::exec() Zeile 2927 C++
socket.exe!main(int argc=1, char * * argv=0x00a07730) Zeile 10 + 0x6 C++
socket.exe!WinMain(HINSTANCE__ * instance=0x00400000, HINSTANCE__ * prevInstance=0x00000000, char * __formal=0x00151f16, int cmdShow=1) Zeile 103 + 0x12 C++
socket.exe!WinMainCRTStartup() Zeile 390 + 0x39 C
kernel32.dll!7c816fd7()
ntdll.dll!7c925b4f()
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
entweder byteweise :
oder größere stücke:
Code: Alles auswählen
char byte = 0;
while (!finished){
if( tcp->read(&byte,1) == 1){
......
}
}
Code: Alles auswählen
image = new unsigned char[contentlength];
int ptr = 0
while ( ptr < contentlength ) {
if ( tcp->bytesAvailable() > (contentlength-ptr+100 )) {
ptr += tcp->read((char*) image+ptr, contentlength-ptr );
} else {
msleep(1);
}
}
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
danke für den tipp. anstattChristian81 hat geschrieben:Das sieht ok aus, auch wenn ich msleep() nicht gutheissen kann... denke das Signal readyRead () ist da eine bessere Wahl.
Kannst Du ggf. auf 4.2.2 aktualisieren damit wir sehen ob es ggf. an Qt liegt?
msleep(1) mach ich..
tcp->waitForReadyRead(-1)
qt 4.2.2. kann ich mir mal drauf machen...