QPixmap über QDataStream schicken

Alles rund um die Programmierung mit Qt
ObeliX
Beiträge: 59
Registriert: 14. November 2007 17:47

Beitrag von ObeliX »

da fällt mir noch was ein :

wenn er beim senden durch die waitfor...-geschichte durch ist, bleibt er da in der run()-methode oder wird diese verlassen (womit ja die socket-verbindung abgebaut würde) ?


Obel
kochi
Beiträge: 11
Registriert: 8. Januar 2008 15:16

Beitrag von kochi »

hoi,

alles weglassen geht net, halt das am client geht net, weil er sonst irgendwann versucht etwas aus dem strea zu lesen wenn der server vlt noch gar nichts geschickt hat, und wenn ich das waitForReadyRead lass und beim server dann das mit usleep versuch greif das waitForReadyRead net und der verbindungsversuch scheitert.

wenn i flush und waitfor am server allein weglass gehts auch wieder nur teilweiße, kommt ma vor das es dann seltener funktioniert

hm komisch is das er manchmal 4380 oder 7300 oder 11060 Bytes zum lesen hat und manchaml 12938 wo ers dann speichern kann, so eine scheiße xD null plan warum der pc das so macht, ..... hmmm

lg kochi
ObeliX
Beiträge: 59
Registriert: 14. November 2007 17:47

Beitrag von ObeliX »

wenn i flush und waitfor am server allein weglass gehts auch wieder nur teilweiße, kommt ma vor das es dann seltener funktioniert
nun gut, das paßt zumindest in mein 'weltbild' :) daß beides eigentlich nicht nötig sein sollte.

und wie sieht es nun nach dem senden aus ... programmtechnisch ? denn wenn du dann die run()-methode verläßt, könnte ich mir vorstellen daß das folgende auswirkung hat :
die daten sind jetzt dem IODevice komplett übergeben worden. da dies bei dir nen tcpsocket ist, ist dies ein gepuffertes device. das heißt, das die daten noch längst nicht übers kabel sind. beim verlassen von run() wird jedoch der socket ungültig. da ist es also mehr oder weniger zufall wie viel der gepufferten daten bereits übertragen sind, wenn der socket gelöscht wird.

zum test würd ich das verlassen von run() mittels usleep() mal ne sekunde verzögern. da brauchst du dann aber wieder ein flush() vorher (falls du das alte rausgenommen hast).
wenn es dann klappt, mußt du deinen sende-thread umbauen, sodaß der socket nicht zerstört wird (dann ist das flush() auch nicht mehr nötig). die sleep-variant ist nur als test gedacht.


Obel
kochi
Beiträge: 11
Registriert: 8. Januar 2008 15:16

Beitrag von kochi »

gut ^^

ähm also der socket wird am ende von run() wieder abgeborchen

Code: Alles auswählen

proband.disconnectFromHost();
	proband.waitForDisconnected(TIMEOUT);
also finde auch dass deine theorie sehr logisch klingt, habs versucht aber leider ändert sich nichts, nur hin und wieder erfolg beim übertragen
Dachte dass der thread beim waitfor wartet bis alles drausen ist aba in der doku steht auch das es nur im iodevice ist und nicht übers kabel,

hier mal meine run()

Code: Alles auswählen

void Worker::run() {

	// Socket aus Socket-Deskriptor ableiten und Textstream aufsetzen
	QTcpSocket proband;
	proband.setSocketDescriptor(socketDesc);
	QDataStream stream(&proband);

	// IP-Adresse und Port merken
	ipAddr = QString("%1:%2")
			.arg(proband.peerAddress().toString())
			.arg(proband.peerPort());
	
	QPixmap image("Logo.PNG");
	cout << "Breite: " << image.width() << " Höhe: " << image.height() << endl;
	cout << "1: QTcpSocket Size: " << proband.size() << "   Bytes am Socket: " << proband.bytesAvailable() << endl;
	stream << image;
	cout << "2: QTcpSocket Size: " << proband.size() << "   Bytes am Socket: " << proband.bytesAvailable() << endl;
	cout << "3: QTcpSocket Size: " << proband.size() << "   Bytes am Socket: " << proband.bytesAvailable() << endl;
	cout << proband.bytesToWrite() << endl;
	
	if (!proband.waitForBytesWritten(TIMEOUT)) {
   		//fehlerBehandeln(pServer->error());
   		return;
	}
	cout << proband.bytesToWrite() << endl;
	cout << "TCPFlush: " << proband.flush() << endl;
	cout << proband.bytesToWrite() << endl;
	usleep(1000);
	
	// Verbindung trennen
 	proband.disconnectFromHost();
	proband.waitForDisconnected(TIMEOUT);
}
vlt liegts auch am client :?

Code: Alles auswählen

void DerConnect::verbinde() {
	// Eventuell bestehende Verbindung abbrechen, neue Verbindung herstellen
	pServer->abort();
	pServer->connectToHost(server->text(), port->text().toInt());
	if (!pServer->waitForConnected(SERVER_TIMEOUT)) {
		//fehlerBehandeln(pServer->error());
		cout << "misslungen" << endl;
		return;
	}
	QDataStream stream(pServer);
	
	cout << "1: QTcpSocket Size: " << pServer->size() << "   Bytes am Socket: " << pServer->bytesAvailable() << endl;
   
	if (!pServer->waitForReadyRead(SERVER_TIMEOUT)) {
   		//fehlerBehandeln(pServer->error());
   		return;
	}
   
	QPixmap image;
	cout << "2: QTcpSocket Size: " << pServer->size() << "   Bytes am Socket: " << pServer->bytesAvailable() << endl;
	stream >> image;
   	cout << "3: QTcpSocket Size: " << pServer->size() << "   Bytes am Socket: " << pServer->bytesAvailable() << endl;
   	cout << "Breite: " << image.width() << " Höhe: " << image.height() << endl;
   	cout << stream.atEnd() <<" <-- Fertig?      speicher Test: " << image.save("here.png", "png") << endl; 
	
}
schade dachte jetzt haben wirs ^^, aba der will das bild net gscheid senden, im notfall lass ich den client so oft das bild anfragen mit ner schleife bis ers speichern kann :D

lg kochi
ObeliX
Beiträge: 59
Registriert: 14. November 2007 17:47

Beitrag von ObeliX »

Code: Alles auswählen

 cout << proband.bytesToWrite() << endl;
 usleep(1000); 
usleep() sind mikro- (µs) nicht milli-sekunden. bei nur 1ms abbruch-verzögerung kann das keine wirkung zeigen. noch geb ich den ansatz nicht verloren :)

Obel
kochi
Beiträge: 11
Registriert: 8. Januar 2008 15:16

Beitrag von kochi »

asoooo =) hab jetzt 1000000 (dass is dann eine sekunde oda?) geschrieben, geht trotzdem nicht, geht immer noch nicht jedes mal =((

kochi
ObeliX
Beiträge: 59
Registriert: 14. November 2007 17:47

Beitrag von ObeliX »

hmm .. da hab ich dann auch keine idee mehr. 1 sekunde sollte langda reichen. ich denke jedoch, daß es ein sende-problem ist, also nicht auf der client-seite.

*schulterzuck*

hoffe du findest noch den wurm
Obel
Antworten