Seite 1 von 1
QUdpsocket in QThreads
Verfasst: 14. Dezember 2005 06:40
von wecka
Hi,
ich habe folgendes Problem in einem Spiel: geplant ist ein Mehrspielermodus, wo zwei Personen gegeneinander spielen. Jeder Beteiligte hat 2 Sender und 2 Empfänger, weil 2 parallele Datenströme unterschiedlicher Priorität benötigt werden.
Habe mich bei der Umsetzung weitestgehend an das Beispiel des FortuneClients/Servers aus der Doku gehalten, nachdem ich bereits einige Stunden mit alternativen Versuchen verbraten hatte.
http://doc.trolltech.com/4.0/network-bl ... lient.html
http://doc.trolltech.com/4.0/network-th ... erver.html
Das Beispiel funktioniert leider mit einem TcpServer und benutzt connectToHost(). Das brauche ich natürlich so bei UDP nicht. Mit bind() hat leider auch nichts wirklich geklappt.
Kann mir jemand einen Tip geben, wie ich das strukturell aufbauen kann?
Zur Zeit gibt es einen Handler, der die benötigten Threads startet und Prioritäten festlegt. Innerhalb der Threads sind die Sockets. Die Kommunikation zwischen Handler und Threads läuft über Signals und Slots. Nun fehlt nur noch eine erfolgreiche Verbindung...

Re: QUdpsocket in QThreads
Verfasst: 14. Dezember 2005 08:53
von Goos
wecka hat geschrieben: Nun fehlt nur noch eine erfolgreiche Verbindung...

Tut mir leid dich enttaeuschen zu muessen, aber UDP ist verbindungslos.
Wieso magst ueberhaupt UDP nehmen? Wie kommst auf die Idee?
Goos
Verfasst: 14. Dezember 2005 11:57
von wecka
Ich möchte UDP benutzen, weil permanent sehr viele Daten übertragen werden müssen, so dass mir TCP zu viel Ballast hat.
In dem Spiel basiert die Steuerung auf der Webcam.
Wie gesagt haben beide Spieler je 2 Sender und 2 Empfänger, weil 2 parallele Datenströme unterschiedlicher Priorität benötigt werden.
Einer für die Spieldaten und einer für den Austausch von den Bildern aus der Kamera.
Verfasst: 14. Dezember 2005 13:01
von Goos
Du musst dir aber dann darueber im klaren sein, dass bei UDP nicht zwangsweise alles auch auf der Empfaengerseite angkommen muss.
Goos
Verfasst: 14. Dezember 2005 13:11
von Goos
Ach und poste doch mal, wie du es bisher probiert und es nicht funktioniert hat
Goos
Verfasst: 15. Dezember 2005 07:10
von wecka
Also, ich habe eine Klasse SocketHandler und darin 4 Threads. Von denen hat jeder einen QudpSocket.
Im ersten Versuch hatte ich ein bind() vom Socket im Thread-Konstruktor drin. Leider hatte der bind() nur false zurückgegeben. In einer reimplementierten start()-Methode im Thread bzw. mittlerweile in der run()-Methode gibts dann den eigentlichen Sende- bzw. Empfangsvorgang.
Im zweiten Versuch habe ich mich wie gesagt an das Beispiel in der QT4-Dokumentation gehalten. Das arbeitet mit connectToHost().
Ich habe meinen aktuellen Stand einmal als Datei mit angehängt...
Verfasst: 15. Dezember 2005 09:56
von Goos
Du hast scheinbar gar nichts im Assistant nachgelesen zum Thema QUDPSocket, so wie mir dein Code ausschaut.
Solltest dir zum Thema UDP Socket erstmal die Beispiele
examples\network\broadcastsender
und
examples\network\broadcastreceiver
anschaun.
Goos
udp
Verfasst: 25. September 2006 16:50
von gschneider
Hi,
ich hab's mit ACE schon mehrfach realisiert. Da gibt es bessere Möglichkeiten udp Verbindungen zu schreiben. Die Dinger laufen bei mir in verschachtelten threads ohen Probleme
Gruß
Gert
Verfasst: 19. Mai 2007 00:55
von M@g!ndo$ch
Hi,
ich habe ein kleines Verständnisproblem bzgl. dem Thema dieses Threads....
Mein Programm funktioniert, aber ich versteh nicht ganz warum ^^
In einer Klasse, die von QThread abgeleitet ist, höre ich auf ein QUdpSocket. Ich lese immer wenn Daten anliegen und speichere sie in einem Puffer. Durch einen Timer getriggert, werden dann die Daten aus dem Puffer an mein restliches Programm weitergereicht.
So sieht der Konstruktor der Klasse aus:
Code: Alles auswählen
UdpListenerThread::UdpListenerThread(int iPort)
{
m_oSocket.bind(iPort); connect(&m_oSocket,SIGNAL(readyRead()),this,SLOT(processPendingDatagrams()));
connect(&m_oTimer,SIGNAL(timeout()),this,SLOT(forwardDatagrams()));
m_oTimer.start(50);
}
Soweit is alles klar! Ich hab allerdings in der run()-Methode nix drin, funktioniert aber trotzdem..... Ich dachte eigentlich wenn die run()-Methode beendet ist, wird der Thread beendet.
Returning from this method will end the execution of the thread.
Kann es viell. sein, dass der Thread durch den Timer "am Leben gehalten wird" ???