![]() |
Multithreading und Globale Funktionen
Hallo!
Ich muss einmal nachfragen bevor ich einen Blödsinn mache! Ich habe mehrere Threads. In einer globalen Unit habe ich dann z.B. diese Funktion:
Delphi-Quellcode:
Kann ich diese einfach im Thread verwenden oder kann es da zu Problemen führen?
function Add(a,b : Integer): Integer;
begin Result := (a + b); end; Es kann ja sein, dass der eine Thread gerade in der Funktion ist und dann ein anderer reinkommt. |
AW: Multithreading und Globale Funktionen
Das führt sogar mit großer Wahrscheinlichkeit zu Problemen.
|
AW: Multithreading und Globale Funktionen
Zitat:
Bei jedem Aufruf einer Funktion, werden die lokalen Variablen neu instantiiert. Jeder Aufrufer hat also seine eigene Instanz. In dem Beispiel hier gibt es noch nicht einmal Variablen. Anders würde es Aussehen bei globalen Vars. |
AW: Multithreading und Globale Funktionen
Zitat:
|
AW: Multithreading und Globale Funktionen
Die Funktion(en) haben natürlich auch Vars.
War ja nur ein Beispiel. Wenn aber für jeden Thread beim Aufruf eine eigene Instanz gemacht wird könnte es funktionieren. Das mit den globalen Variabeln ist mir dann auch klar! |
AW: Multithreading und Globale Funktionen
Eigentlich muss man sich die Grundfrage stellen, ob zwei Threads gleichzeitig auf die gleiche Variable zugreifen können.
Bei lokalen Variablen und bei Parametern schwierig, es sein denn das Referenzen (z.B. Objekte -> also Zeiger) übergibt. |
AW: Multithreading und Globale Funktionen
Ok,
die meisten globalen Vars sind eh TList und ich übergebe das Item als Pointer. Gefärlich wird es natürlich wenn die TList geändert wird aber ein anderer Thread noch damit arbeitet - also wenn das Item dann vielleicht gar nicht mehr da ist. Wie löst man dann sowas? Jeden Thread eine Kopie der TList geben. Die TList nur aus dem MainThread bearbeiten und nach dem Bearbeiten dem Thread die neue Liste übergeben!? |
AW: Multithreading und Globale Funktionen
Zitat:
Suche mal nach "Thread synchronisieren". Stichworte sind Semaphoren, critical sections, Mutex Grüße, Messie |
AW: Multithreading und Globale Funktionen
In Delphi gibt es eine spezialisierte TList dafür.
TThreadList |
AW: Multithreading und Globale Funktionen
Zitat:
Habe es nun eingebaut, jedoch geht es in einem Thread - im anderen nicht!? Ich mache es so in den Threads:
Delphi-Quellcode:
Es bleibt beim Locklist stehen.
var
List : TList; i : Integer; begin List := ALL_Names.Locklist; for i := 0 to List.Count - 1 do begin //do stuff with data end; ALL_Names.UnlockList; Der einzige Unerschied ist, dass es im dem Thread wo es nicht geht in der Thread.Execute ausgeführt wird. Im Thread wo es geht wird es per ein OnUDPRead Thread ausgeführt. Also der Thread hat einen UDP-Server mit einer OnUDPRead vom Thread. Da geht es ohne Probleme. Kann das LockList nicht im Execute vom Thread ausgeführt werden weil der Thread dann stehen bleibt und das Locklist nicht durchgeführt werden kann?? Ein zusätzliches ALL_Names.UnlockList davor bringt auch nichts. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 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 by Thomas Breitkreuz