QTcpSocket stream verarbeiten

Alles rund um die Programmierung mit Qt
Antworten
JeanLuc
Beiträge: 7
Registriert: 19. Februar 2007 08:52

QTcpSocket stream verarbeiten

Beitrag von JeanLuc »

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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

QTcpSocket schreibt und ließt die Daten aus/in einem internen Puffer somit müßten alle QIODevice-Funktionen Probleme haben...

Laß halt mal einen Debugger mitlaufen und wenn das Programm abschmirrt kann man zumindest den Stack zurückverfolgen lassen.
JeanLuc
Beiträge: 7
Registriert: 19. Februar 2007 08:52

Beitrag von JeanLuc »

der stack führt mich in interne routinen des QTcpSockets..
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Kannst du den Stack-Trace mal posten?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Welche Qt-Version benutzt du? Laut Trolltech Task-Tracker gibts da schon einiges Bugs...
JeanLuc
Beiträge: 7
Registriert: 19. Februar 2007 08:52

Beitrag von JeanLuc »

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:

Beitrag von Christian81 »

Und jetzt noch deinen Code wie Du von QTCPSocket lesen willst. Ich würde sagen dort ist was falsch.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
JeanLuc
Beiträge: 7
Registriert: 19. Februar 2007 08:52

Beitrag von JeanLuc »

entweder byteweise :

Code: Alles auswählen

char byte = 0;
while (!finished){
	if( tcp->read(&byte,1) == 1){
          ......
	}	
}

oder größere stücke:

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:

Beitrag von Christian81 »

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?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
JeanLuc
Beiträge: 7
Registriert: 19. Februar 2007 08:52

Beitrag von JeanLuc »

Christian81 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?
danke für den tipp. anstatt
msleep(1) mach ich..
tcp->waitForReadyRead(-1)


qt 4.2.2. kann ich mir mal drauf machen...
JeanLuc
Beiträge: 7
Registriert: 19. Februar 2007 08:52

Beitrag von JeanLuc »

yuhuu es klappt!

es lag anscheinende an dem msleep(1) .

vielen dank nochmal
Antworten