Gemischtes / mishmash

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

User avatar
Horst
Posts: 336
Joined: Tue Oct 13, 2015 3:27 pm

Gemischtes / mishmash

Post by Horst »

Hallo Wolfgang
Ich habe den Server mit deiner Hilfe nun zum Laufen gebracht. Habe die App mal angehängt. Ich habe noch eine Fehlermeldung wenn man im Consolefenster Stop eingibt. Leider weiss ich nicht was da passiert.

Dann noch eine Frage. Beim Start ruft man den Server mit einem Parameter auf z.B. 8 . Das sind die max. Anzahl an Threads die gestartet werden können (nehme ich an) . Habe nun mehr als 8 mal auf dem Browser F5 gedrückt. Dann bekommt der Browser keine Antworten mehr. Kann man Anzahl Thread auf sagen wir 1024 setzen ? 128 habe ich schon probiert, das haut hin. Lieber wäre es mir wen es diese Limit nicht gäbe. Bei deinem Listener wird eine Liste abgearbeitet einen nach dem anderen.
Gruss
Horst
Attachments

[The extension viaef has been deactivated and can no longer be displayed.]

User avatar
SHirsch
Posts: 286
Joined: Tue Jan 30, 2018 8:23 am
Location: Germany

Gemischtes / mishmash

Post by SHirsch »

Hallo Horst,
weil Wolfgang noch nicht geantwortet hat und es mich interessiert, hänge ich mich mal rein.
Hat sich der Browser wirklich aufgehängt? Der wartet vermutlich einfach nur. Du hast 8 Threads, somit können theoretisch 8 Anfragen gleichzeitig bearbeitet werden. Deine Anfragen dauern ja ne Weil. Wenn du jetzt innerhalb der Bearbeitungszeit sagen wir 20 Mal Aktualisieren drückst, werden die ersten 19 Anfragen von deinem Server bearbeitet, was ne Weile dauert. Die 20. Anfrage wird dann vom Browser verarbeitet, die alten Anfragen werden verworfen. Der Browser muss also warten.
Jetzt kannst du natürlich deine Threads auf 1024 erhöhen. Was aber nur scheinbar hilft. Denn wenn du dir dann deine CPU Last anschaust, geht die durch die Decke. Die Threads werden hin und her geschalten. Für einen einzelnen User mag das einen Vorteil bringen. Wenn du jetzt aber viele Anfragen von verschiedenen System hast, müssen am Ende alle länger warten, weil das Umschalten der Thread auch Zeit kostet.
Sinnvoll (aus meiner Sicht) ist hier nur ein Wert der maximal deiner Prozessorenanzahl entspricht.

Den Fehler beim Beenden kannst du durch geordnetes Beenden deiner Threads vermeiden. Ich habe dir das mal eingebaut (CancellationToken in messages:Take)

Stefan
Attachments

[The extension viaef has been deactivated and can no longer be displayed.]

User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Gemischtes / mishmash

Post by wriedmann »

Hallo Horst,
das ist der große Vorteil von diesem Forum: es lesen auch andere mit und können antworten. Und in diesem Fall hat der Stefan besser geantwortet, als ich es gekonnt hätte.
Ich habe Deine Frage schlicht zu spät gesehen - manchmal passiert es auch, dass ich einen halben Tag oder länger keine Zeit habe, hier reinzuschauen oder zu antworten.
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
Horst
Posts: 336
Joined: Tue Oct 13, 2015 3:27 pm

Gemischtes / mishmash

Post by Horst »

Hallo Stefan.
Ich hab das mal getestet. 4 Threads beim start definiert. 2 Browser offen und auf jedem 5 Tabs. Dann starte ich alle nacheinander. Die 10 werden alle schön verarbeitet. Nun drücke ich 3x F5 in einem Tab, dass funktioniert noch. Drücke ich 4 mal F5 wird 1 mal gearbeitet danach dreht der Browser oder App im Leerlauf. Die App hat dann 0% CPU und die App hängt sich irgendwie auf. Sie schreibt in die Console das der Prozess gestartet wird aber nichts passiert. Ich muss die App beenden und neu starten. Setze ich die Threads auf 128 dann passiert das nicht.
Gruss
Horst
User avatar
SHirsch
Posts: 286
Joined: Tue Jan 30, 2018 8:23 am
Location: Germany

Gemischtes / mishmash

Post by SHirsch »

Hallo Horst,

das Problem ist, dass die Threads abstürzen, weil beim Senden der Antwort der Socket nicht mehr verbunden ist. Das muss mit TRY abgefangen werden, dann klappt es auch mit 4 Threads:

Code: Select all

WHILE SELF:closeToken:IsCancellationRequested == FALSE  
    TRY
        Console.WriteLine(Time()+" Processor {0} awoken.", number)
        context := messages:Take(SELF:closeToken:Token)
        Console.WriteLine(Time()+" Processor {0} dequeued message.", number)
        SELF:Response(context)
    CATCH ex AS Exception
        Console.WriteLine(Time()+" Processor {0} crashed. {1}", number, ex:ToString())
    END TRY
END WHILE
Bei 128 Threads musst du nur lange genug testen, dann hast du das gleiche Problem. Ist beim Kunden dann nicht so gut, weil dass dann schwer rauszukriegen ist. Am besten immer mit minimalen Resourcen probieren und analysieren, warum es nicht klappt. Klar heutzutage haben die PCs massig RAM, viele Prozessorkerne und schnelle Festplatten, aber für die Performance muss man schon selber sorgen, sonst bremst man das beste Superduperhypermegasystem trotzdem aus.

Stefan
User avatar
Horst
Posts: 336
Joined: Tue Oct 13, 2015 3:27 pm

Gemischtes / mishmash

Post by Horst »

Hallo Stefan
Danke. So hängt sich wenigstens die App nicht auf. Werde es mal auf 64 einstellen und mir eine Notiz im Prg machen.
Jetzt läuft das 'Motörchen' und ich kann endlich meine Prg's anpassen :-) Bin schon gespannt ob es einen merklichen Unterschied (Geschwindigkeit) zu meinen alten CGI Programmen geben wird.

Gruss
Horst
User avatar
Horst
Posts: 336
Joined: Tue Oct 13, 2015 3:27 pm

Gemischtes / mishmash

Post by Horst »

Hallo
Habe jetzt mal eine Frage zu den Variablen Deklarationen in Klassen. Ich habe da nun Private genommen und die sollten eigentlich überall in der Klasse sichtbar sein.
In Lib 1 ist die AA-Klasse mit der Privatevariablen cParam definiert. In Lib2 habe ich die BB-Klasse die von AA-Klasse erbt. Der Compiler sagt mir nun das ich keinen Zugriff auf die Variable cParam habe wenn ich die Lib2 compiliere.
Was mache ich da falsch ?
Gruss
Horst
User avatar
robert
Posts: 4520
Joined: Fri Aug 21, 2015 10:57 am
Location: Netherlands

Gemischtes / mishmash

Post by robert »

Horst,

PRIVATE is the same as HIDDEN: not visible in subclasses
To allow the subclass to access the class member you have to declare it as PROTECT

Robert
XSharp Development Team
The Netherlands
robert@xsharp.eu
User avatar
Horst
Posts: 336
Joined: Tue Oct 13, 2015 3:27 pm

Gemischtes / mishmash

Post by Horst »

Thanks Robert
User avatar
Horst
Posts: 336
Joined: Tue Oct 13, 2015 3:27 pm

Gemischtes / mishmash

Post by Horst »

Hallo
Diese Zeile ist in Lib1
SELF:odbUser := _CryptServer {WorkDir ()+ SELF:cPathDbfSys + "User.dbf" , TRUE,FALSE,"DBFCDX"}

und die Klasse habe ich in Lib2
CLASS _CryptServer INHERIT DbServer
PUBLIC CONSTRUCTOR()
SUPER ()
RETURN
Beim Constructor stürzt das Teil ab. Hat sicher was mit den Parametern zu tun ?
Was angezeigt wird ist Arg: oFile Argumente: {{null}} Gerufen von: Init

Gruss
Horst
Post Reply