![]() |
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! |
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
![]() Zitat:
|
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? |
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!:) |
AW: Multithreading mit OmniThreadLibrary
Zitat:
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:
(was eigentlich nichts anderes als
TThread.Yield
Delphi-Quellcode:
macht).
Sleep(0)
Aber eine Message-Warteschlange zum Abarbeiten gibt es hier nicht. |
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. |
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 11:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz