Entwickler-Ecke

Internet / Netzwerk - CleintSocket Befehlsroutinen verbessern


Cyberaxx - Fr 09.09.05 14:20
Titel: CleintSocket Befehlsroutinen verbessern


Narses - Fr 09.09.05 15:05

Moin!

Ich muss leider sagen, dass die TClient/ServerSocket-Kompos nicht wirklich leistungsfähig sind. Man kann die Dinger zu didaktischen Zwecken ganz gut benutzen (z.B. im Rahmen des Schulunterrichts oder zum Testen), aber für produktive Systeme sind die einfach zu schlecht... :arrow: Indy-TCP-Server nehmen!

Tja, so ist das Leben... :wink:

Wenn du trotzdem bei TServerSocket bleiben willst, könntest du versuchen, die Daten im OnClientRead an einen ProcessorThread zu übergeben (über eine thread-sichere Liste z.B.) und damit den Hauptthread entlasten. Dann brauchst du aber auch eine thread-sichere Clientverwaltung... :?

Was du mit dynamischen Komponenten in diesem Zusammenhang meinst/bewirken willst, ist mir noch nicht ganz klar; dir vielleicht auch nicht... ? :gruebel:

Viel Spaß noch! :wink:

cu
Narses


Cyberaxx - Fr 09.09.05 15:10

Ganz einfach wenn eine SQL Anweisung 2 mal direkt gebraucht wird und ich sie dynamisch mit nem Array laufen lasse kann man sie ein zweites mal starten oder sehe ich das falsch?

Der nachteil dabei ist das die SQL anweisung verdammt lastig ist.

Die Probleme kommen so gesehen ja nicht von der Socket Komponente. nur ich muss ja jede Nachrricht verarbeiten.


Narses - Fr 09.09.05 15:16

Moin!

user profile iconCyberaxx hat folgendes geschrieben:
Ganz einfach wenn eine SQL Anweisung 2 mal direkt gebraucht wird und ich sie dynamisch mit nem Array laufen lasse kann man sie ein zweites mal starten oder sehe ich das falsch?

Ehrlich gesagt verstehe ich nicht, was du damit meinst... :gruebel: Willst du mehrere SQL-Query-Kompos gleichzeitig einsetzen oder wie?

user profile iconCyberaxx hat folgendes geschrieben:
Der nachteil dabei ist das die SQL anweisung verdammt lastig ist.

Dann solltest du über Alternativen dazu nachdenken... :wink:

user profile iconCyberaxx hat folgendes geschrieben:
Die Probleme kommen so gesehen ja nicht von der Socket Komponente. nur ich muss ja jede Nachrricht verarbeiten.

Bist du dann hier nicht in der falschen Sparte? :arrow: Datenbanken

cu
Narses


Cyberaxx - Fr 09.09.05 15:25

Ne denke in Datenbanken ist es falsch aufegehoben denn die SQL Anweisungen funktionieren. Ich hatte ja geschrieben ich weiss nicht ob ich hier richtig bin siehe Eröffnungspost.

Wenn jemand 2 mal !Users aufruft und die Procedure noch nicht fertig ist wird das zweite mal das !users übergangen. Ich dachte es so wenn ich die Komponente dynamisch erzeuge, so könnte das zweite !users auch ausgeführt werden, ist ja sogesehen eine neu erzeugte Komponente. Ich weiss auch nicht ob es so gut wäre nun alle Befehle in einen Thread auszulagern da der Hauptthread ja so nix tut...


Narses - Fr 09.09.05 15:36

Moin!

user profile iconCyberaxx hat folgendes geschrieben:
Ne denke in Datenbanken ist es falsch aufegehoben

Aber du willst doch die Performance der SQL-Anweisungen verbessern, haben wir gerade herausgefunden, oder? Also :arrow: Datenbanken.

user profile iconCyberaxx hat folgendes geschrieben:
Wenn jemand 2 mal !Users aufruft und die Procedure noch nicht fertig ist wird das zweite mal das !users übergangen. Ich dachte es so wenn ich die Komponente dynamisch erzeuge, so könnte das zweite !users auch ausgeführt werden, ist ja sogesehen eine neu erzeugte Komponente. Ich weiss auch nicht ob es so gut wäre nun alle Befehle in einen Thread auszulagern da der Hauptthread ja so nix tut...

Hmm, ich philosophiere mal frei (bin ja nicht komplett im Thema):
- wenn du eine StringListe nimmst und in die Strings die empfangenen Anweisungen packst, in die Objects[] die Socket-Kompo, die diese gesendet hat, dann haste einen "Auftragsliste"
- diese verarbeitet ein Processor-Thread, sequentiell; damit ist dein HauptThread lastfrei und reagiert besser auf die GUI und die SocketKompos (die synchronisieren sich intern nämlich über den MessageLoop des Hauptthreads)
- so gehen keine Anfragen verloren
- Problem: geht natürlich nicht mit TStringList, weil das Ding nicht threadsave ist :arrow: Forschung betreiben

cu
Narses


Cyberaxx - Fr 09.09.05 15:49

Naja ich würde gerne bei den ADOs bleiben die laufen gut sind nur lastig das habe ich ja umgangen das der Service halt weiter läuft. Auch wenn die die Anweisungen verbessern würde löst es nicht das Problem wenn ich im selben zeitraum weitere SQL(die selben) brauche.

BSP:

10:00:12 >> User(a) startet !users im Channel #welcome
11:00:12 >> User(b) startet !users im Channel #test

Dann bekommt die Socket Komponente ja zwei Befehle und versucht im selben Moment zwei mal die Procedure aufzurufen, so wie der Service im moment geschrieben ist. Damit das Programm weiter läuft lässt er ja im Moment die zweite Abfrage weg fallen.

Mir ist jetzt klar hier ist sie vllt. nicht ganz richtig aber warum ausgerechnet bei Datenbanken?
Es läuft ja alles gut so wie es ist vom SQL her.

Das andere was Du angesprochen hast klingt schon um einiges interessanter, ist ja fast nichts anderes als nen Buffer.


Narses - Fr 09.09.05 16:01

Moin!

user profile iconCyberaxx hat folgendes geschrieben:
aber warum ausgerechnet bei Datenbanken?

Dir laufen die Datenbankprozesse zu langsam/lastig. Ist das kein Datenbank-"Problem"? :wink:

user profile iconCyberaxx hat folgendes geschrieben:
Das andere was Du angesprochen hast klingt schon um einiges interessanter, ist ja fast nichts anderes als nen Buffer.

Ja, klar; wenn Anweisungen verloren gehen, dann muss man sie eben zwischenspeichern. :wink:

cu
Narses


Cyberaxx - Fr 09.09.05 16:27

Ich bin es gewohnt mit den ADOs zu arbeiten lässt sich also so nichts dran ändern. und wie ich bereits gesagt habe auch wenn sie schneller laufen aber vom Server zum selben Zeitpunkt zwei oder mehr nachrichten kommen bringt mir eine beschleunigung der SQL auch nichts. Drum ist es für mich kein Datenbank Problem. Es ght hier nur darum wie ich die empfangen Daten gleichzeitig verarbeite. Dieser Bereich ist nun nicht der richtige aber den Breich Datenbanken halte ich also auch nicht für 100% angebracht.

Wie gesagt das mit dem buffern ist nicht schlecht. Muss mich halt in den Bereich einarbeiten und genau darum habe ich hier den Thread eröffnet um eben mein Projekt zu optimieren.


Cyberaxx - Mi 14.09.05 15:32

Habe jetzt einen Thread am laufen. Kann ich im Thread auch die ADO's bzw generell Komponenten benutzen oder muss ich das wieder auf einer anderen 'Form' machen mit Synchronize?

@dit: Frage hat sich erledigt. Hab es jetzt am laufen mit dem Buffer und es scheint auch zu laufen. :)