Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Multithreading mit OmniThreadLibrary (https://www.delphipraxis.net/185600-multithreading-mit-omnithreadlibrary.html)

Ralle1 23. Jun 2015 13:33


Multithreading mit OmniThreadLibrary
 
Hallo!

Ich möchte mit Hilfe der OmniThreadLibrary einen Multi-User-Betrieb simulieren.

Ich habe eine Procedure, die einen Connect auf meine Datenbank erstellt und fest definierte Lese/Schreibe-Zugriffe durchführt.
Diese soll nun von n Threads (=simulierte User) gleichzeitig durchgeführt werden.

Gemessen werden soll die Zeit, bis alle n Threads abgelaufen sind. Wichtig ist, dass sie gleichzeitig und nicht nacheinander laufen sollen.

OmniThreadLibrary scheint mir hierzu das richtige Werkzeug, habe es aber noch nie benutzt und komme mit den gefundenen Beispielen nicht klar.
Kann mir jemand ein passendes Beispiel hierfür geben oder zumindestens einen Ansatz?

Vielen Dank!

Uwe Raabe 23. Jun 2015 13:52

AW: Multithreading mit OmniThreadLibrary
 
Im Wesentlichen muss jeder Thread seine eigene Connection zur Datenbank und die zugehörigen Datenzugriffsobjekte haben. Einen groben Umriss einer solchen Anwendung beschreibt dieser Artikel, bei dem Webseiten-Inhalte abgerufen und in Datenbanken geschrieben werden. Die tatsächliche Implementierung ist natürlich von der verwendeten DB-Zugriffsschicht abhängig. Dazu hast du dich aber noch nicht geäußert.

Zitat:

Zitat von Ralle1 (Beitrag 1306280)
Wichtig ist, dass sie gleichzeitig und nicht nacheinander laufen sollen.

Es können natürlich nur soviele Threads gleichzeitig laufen, wie die Hardware hergibt. Was ja nicht heißt, daß mehr Threads gestartet sein können und eine Verbindung offen halten.

Ralle1 23. Jun 2015 14:44

AW: Multithreading mit OmniThreadLibrary
 
Die DB-Zugriffsschicht habe ich bewusst nicht erwähnt, da es mir tatsächlich nur um den Thread-Ansatz ging. Jeder Thread muss natürlich autark funktionieren.

Es müsste doch möglich sein, dass innerhalb der Threads ProcessMessages durchgeführt wird, so dass wirklich mehrere Dinge nicht gleichzeitig aber quasi "nebeneinander" her laufen, oder sehe ich das falsch?

Jens01 23. Jun 2015 14:56

AW: Multithreading mit OmniThreadLibrary
 
Es gibt übrigens im Verzeichnis "Tests" noch viele Beispiele. Die sind aber etwas verwirrend, da sie eigentlich erst ab der Nummer ca 35 los gehen. Die mit einer kleineren Nummer sind veraltet.

Für OTL benötigt man etwas Geduld, um es zu verstehen. Nicht gleich aufgeben!:)

Sir Rufo 23. Jun 2015 15:02

AW: Multithreading mit OmniThreadLibrary
 
Zitat:

Zitat von Ralle1 (Beitrag 1306292)
Es müsste doch möglich sein, dass innerhalb der Threads ProcessMessages durchgeführt wird, so dass wirklich mehrere Dinge nicht gleichzeitig aber quasi "nebeneinander" her laufen, oder sehe ich das falsch?

Nein, Nein und nochmal Nein!

Threads laufen nebeneinander her, aber wann diese laufen hängt vom Betriebssystem (Scheduler) und von den zur Verfügung stehenden CPU-Kernen ab.

Ja, es gibt etwas um das System zum Threadwechsel zu animieren mittels
Delphi-Quellcode:
TThread.Yield
(was eigentlich nichts anderes als
Delphi-Quellcode:
Sleep(0)
macht).

Aber eine Message-Warteschlange zum Abarbeiten gibt es hier nicht.

TiGü 23. Jun 2015 15:33

AW: Multithreading mit OmniThreadLibrary
 
Wozu braucht man hier die OmniThreadLibrary?

Erstelle dir eine Liste mit eigenen abgeleiteten Threads, übergebe in deren Constructor die notwendigen Daten für die Datenbankverbindung und dann lass loslaufen.

Neutral General 23. Jun 2015 15:38

AW: Multithreading mit OmniThreadLibrary
 
Um die Verwirrung etwas zu mindern eine kleine Erklärung die hoffentlich hilft:

Generell (bei nur einem CPU-Kern z.B.) laufen Prozesse und Threads nicht WIRKLICH gleichzeitig.
Auch wenn du Notepad, Firefox und World of Warcraft offen hast läuft immer nur eins dieser Programme zu einem bestimmten Zeitpunkt.
Das Betriebssystem wechselt nur so schnell zwischen den Prozessen/Threads hin und her, dass das nicht auffällt und es sich anfühlt als würden
diese Prozesse/Threads alle gleichzeitig/parallel ausgeführt werden.

Uwe Raabes Anmerkung war, dass ECHTE Gleichzeitigkeit nur mit mehreren CPU-Kernen möglich ist.
Also 1 Kern führt Notepad aus und der andere führt GLEICHZEITIG Firefox aus.
Und auch dann können nur so viele Prozesse/Threads gleichzeitig ausgeführt werden wie die CPU Kerne besitzt.

Es ist halt die Frage was du genau testen willst. Mit einer Quadcore CPU kannst du genau genommen NICHT simulieren dass
8 verschiedene Benutzer ABSOLUT gleichzeitig auf die Datenbank zugreifen, weil es in der Praxis so sein wird dass
(im Idealfall) 2x 4 Zugriffe hintereinander ausgeführt werden (innerhalb weniger ms).

Wenn du den Datenbankserver bzw. die Datenbank nur testen willst ob sie eine gewisse Belastung aushält musst
du dir darüber aber in meinen Augen keine Gedanken machen.

Application.Processmessages o.ä. hat in einem Thread nichts zu suchen. Threads werden auch so schon (pseudo-)parallel ausgeführt! (s.o.)

Habe die OTL noch nicht benutzt aber je nachdem solltest du erst mal mit TThread o.ä. rumexperimentieren, da dir in dem Bereich Threads wohl
noch ein Stück Erfahrung und Wissen fehlt und dich die OTL möglicherweise nur noch mehr verwirren könnte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz