TDataModule und TThreads, Multithreading
-
TDataModule und TThreads, Multithreading
Ich versuche hier gerade eine alte Anwendung auf Multithreading umzustellen. Es wird 3 Threads geben, die auf die Datenbank zugreifen. Wie mache ich das am sinnvollsten? Mache ich das TDataModule threadsicher (ziemlicher Aufwand), oder (viel einfacher) erstelle ich in jedem Thread eine eigene Instanz des TDataModules. Oder erstelle ich gar für jeden Thread ein eigenes TDataModule. Die Threads wären jeweils für unterschiedliche Bereiche zuständig, greifen aber alle auf dieselben Tabellen in der Datenbank zu und die Queries wären teilweise identisch (was dann bei jeweils einem eigenem TDataModule zu höherem Wartungsaufwand führt).
Falls es relevant ist: Schreiben würde nur ein Thread, die anderen würden nur Lesen.Jeweils eine Instanz des TDataModule für jeden Thread scheint mir das sinnvollste zu sein. Da Mulitthreading aber relatives Neuland für mich ist, möchte ich fragen, ob mir mit dieser Vorgehensweise Probleme einhandele. Schließlich habe ich dann nicht mehr eine Verbindung zur Datenbank, sondern gleich drei. Aber wichtiger ist, kommen die sich irgendwie ins Gehege? Sollte meinem Verständnis nach nicht der Fall sein, da ja jeweils eigene Instanzen.
Oder handele ich serverseitig Probleme ein (MS-SQL-Server 2019)?Und wenn ich schon dabei bin:
Spricht irgendetwas dagegen, ein Objekt im Thread zu erzeugen und im VCL-Thread zu löschen? Da ich Synchronize() nicht mag, wollte ich die Threads so anlegen, dass sie auf Events reagieren und eine Windowsmessage an die Application senden, wenn sie die Arbeit erledigt haben und die Daten abholbereit sind. Ich würde dann nur den Zeiger übernehmen und in einen Container im VCL-Thread legen. Soweit ich das verstehe, ist das kein Problem, da die Threads (inkl. des VCL-Threads) alle im gleichen Prozessraum liegen.Und ja, auch wenn Multithreading Neuland für mich ist, ist mir klar, dass ich Synchronisierungsobjekte benötige. Ich weiß nur noch nicht, ob die VCL-internen (TCriticalSection, TMultiReadExclusiveWriteSynchronizer) nehme, oder die aus der WinAPI (CriticalSection, Slim Reader/Writer). Hat jemand Erfahrung mit den VCL-internen? Sind die brauchbar, oder sollte ich direkt auf die WinAPI-Pendants zurückgreifen.