Seite 1 von 1

QTcpSocket stream verarbeiten

Verfasst: 19. Februar 2007 09:01
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

Verfasst: 19. Februar 2007 16:59
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.

Verfasst: 20. Februar 2007 08:57
von JeanLuc
der stack führt mich in interne routinen des QTcpSockets..

Verfasst: 20. Februar 2007 19:55
von upsala
Kannst du den Stack-Trace mal posten?

Verfasst: 20. Februar 2007 20:06
von upsala
Welche Qt-Version benutzt du? Laut Trolltech Task-Tracker gibts da schon einiges Bugs...

Verfasst: 21. Februar 2007 10:46
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() 	



Verfasst: 21. Februar 2007 10:56
von Christian81
Und jetzt noch deinen Code wie Du von QTCPSocket lesen willst. Ich würde sagen dort ist was falsch.

Verfasst: 21. Februar 2007 11:09
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);
		}
}

Verfasst: 21. Februar 2007 11:26
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?

Verfasst: 21. Februar 2007 11:41
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...

Verfasst: 21. Februar 2007 13:29
von JeanLuc
yuhuu es klappt!

es lag anscheinende an dem msleep(1) .

vielen dank nochmal