QT mit C++

Seiten: 1
Huggybear
Verfasst am: 11.06.2014 um: 15:11 Uhr
 
Cw's Alleinunterhalter
Alleinunterhalter
Beiträge: 286
SPAM:
0% Spam
Mal sehen, ob mir hier wer weiterhelfen kann.

Ich habe einen Server mit QTcpServer erstellt. Dieser kann Daten eines Clients empfangen und Daten an einen Client schicken. Es gibt nur einen Client der verbunden sein kann.
Mein Problem ist, dass wenn ich den Server z.B. in einer Schleife 10.000 Daten an den Client schicken lasse, aber noch kein Client verbunden ist. Dann passiert nichts (was auch passt). Aber wenn ich wärend dessen den Client verbinde, sollen die Daten natürlich geschickt werden. Das passiert aber nicht, da der Server die Verbindung des Clients erst handled wenn er seine 10.000 Versuche durch hat.

Die Frage ist jetzt, ob der Server intern zwei Threads benötigt (einen lesenden, einen schreibenden) oder ob da irgendwas anderes krum ist.
Hat da jemand Erfahrung mit?

MfG
Huggybear
 



markush
Verfasst am: 11.06.2014 um: 17:33 Uhr
 
Dr. CwCity.de
Community God
Beiträge: 3832
SPAM:
0% Spam
Ich schätze mal da ab wird die Verbindung nicht richtig aufgebaut, den bei einer TCP Verbindung können Daten in beiden Richtungen übertragen werden. So wie du es beschreibst klingt es für mich wie eine UDP Verbindung. Bei TCP sendest du ein Paket und wartest die Antwort ab, dann erst das nächste Paket oder wenn keine Antwort kommt, dann eine Fehlermeldungen ausgeben.

Auf der QT Seite gibt es dafür ein Beispiel:
qt-project.org/doc/qt-5/qtnetwork-f...
qt-project.org/doc/qt-5/qtnetwork-f...


Der Link zu meinem Github Profil

Weitere Links:
--> ratgeber---forum.de (Danke für die Unterstützung) <--

Letzte Änderung am: 11.06.2014 um: 17:38 Uhr durch: markush
 

duxaquila
Verfasst am: 11.06.2014 um: 17:46 Uhr
 
Cw Posting Dude
Poster Teufel
Beiträge: 131
SPAM:
0% Spam
Es klingt eher so, als würdest du das in einen Loop laufen lassen. So das der Process erst dieses abarbeitet bevor er was neues ausführen kann.

Falls das der fall sein sollt, kannst du das nicht in eienr Function auslagern ud es dann per Timer laufen lassen? So ist der Process noch im stande was anderes auszuführen


Denn das Problem an schleifen ist, das diese strickt abgearbeiutet werden und die Anwendung solang in einem "schlaf" ist. Das ganze kann nachher bei mehr belastung zu fehlverhalten führen, so dass anweisungen sich verstricken und oder es zu loss kommt.



Letzte Änderung am: 11.06.2014 um: 17:48 Uhr durch: duxaquila
 

Huggybear
Verfasst am: 12.06.2014 um: 10:44 Uhr
 
Cw's Alleinunterhalter
Alleinunterhalter
Beiträge: 286
SPAM:
0% Spam
Erstmal Danke für den Input.

@markush: TCP ist es mit Sicherheit. Meine Serverklasse erbt von QTcpServer :)

@duxaquila: Das Senden der 10.000 Daten läuft in einer Schleife. Das die das ganze blockiert hatte ich befürchtet. Ich werde mir dann mal QTimer näher ansehen und testen ob ich das damit hinbekomme.

MfG
Huggybear
 

consider
Verfasst am: 12.06.2014 um: 11:22 Uhr
 
Dr. CwCity.de
Community God
Beiträge: 7217
SPAM:
0% Spam
Habe keine großen C++ Kenntnisse. Jedoch erscheint es mir logisch, dass die Schleife erst mal abgearbeitet wird, wie in jeder anderen Sprache auch.

Normalerweise sollte es kein Poblem sein, mehrere Threads an einem Socket "lauschen" zu lassen. Sieh dir zB den Apache Webserver an, wenn er MPM-Worker kompiliert ist. Dort wird pro eingehender Anfrage auf Port 80 ein neuer Thread erstellt, der dann die Kommunikation abhandelt. Über den selben Port natürlich. Daran würde ich mir ein Beispiel nehen.

Konsequent in Threads aufzuteilen wird sicher auch um einiges performanter, da die meisten Rechner heute eh 2+ Kerne haben und das OS ja immer versucht, diese möglichst auf die Kerne aufzuteilen.

Vom Design her wär daher meine Idee, einen Thread zu erstellen, der auschleisslich dazu da ist, auf eingehende Verbindungen zu warten und dann eben pro Verbinung einen weiteren Thread zu erstellen, welcher dann die Kommunikation abwickelt. So würde der Server niemals blockiert.

PS: We gesagt, kaum C++ Kenntnisse, dafür fit in TCP/IP. Also aus C++ Sicht vielleicht mit Vorsicht zu geniessen.




Letzte Änderung am: 12.06.2014 um: 11:31 Uhr durch: consider
 

Huggybear
Verfasst am: 17.06.2014 um: 08:55 Uhr
 
Cw's Alleinunterhalter
Alleinunterhalter
Beiträge: 286
SPAM:
0% Spam
Threads sind mit QT nicht so lustig :) Die Signale, mit denen z.B. der Server checkt, dass es Daten zu lesen gibt funktionieren nur im Main-Thread richtig und müssen alle durchgereicht werden.

Die Lösung, die ich mir jetzt zusammengebastelt habe:

Server läuft auf dem Main-Thread, die Logik (erzeugt die zu schickenden Daten) in einem weiteren Thread. Mittels Timer erzeugt die Logic Daten, übergibt die mittels Signal an den Server, der schickt die Daten an den Client. Das funktioniert ganz super so

Vielen Dank für eure Anregungen, besonders für duxaquila's Hinweis auf die Timer.

MfG
Huggybear
 

duxaquila
Verfasst am: 17.06.2014 um: 12:20 Uhr
 
Cw Posting Dude
Poster Teufel
Beiträge: 131
SPAM:
0% Spam
Das ist schön das ich dir da ein tipp geben konnte.

Wofür eigl die 1000 Versuche? was amchen die denn?

 

Huggybear
Verfasst am: 24.06.2014 um: 08:35 Uhr
 
Cw's Alleinunterhalter
Alleinunterhalter
Beiträge: 286
SPAM:
0% Spam
Das war um zu testen ob der Server das packt. Und da ist dann aufgefallen, dass der Server das zwar locker schafft die zu schicken, dann aber eingehende Daten erst nach Ablauf der Schleife bearbeitet. Da die vom Server gesendeten Daten in regelmäßigen Abständen generiert werden müssen, war das auch erst mit einer Schleife realisiert. Und das gab eben Probleme :)

MfG
Huggybear
 

 
Seiten: 1

Folgende User sind hier gerade aktiv:
-

ANZEIGE