Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Multithreading und Globale Funktionen (https://www.delphipraxis.net/157286-multithreading-und-globale-funktionen.html)

schwa226 6. Jan 2011 17:26

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:
function Add(a,b : Integer): Integer;
begin
   Result := (a + b);
end;
Kann ich diese einfach im Thread verwenden oder kann es da zu Problemen führen?
Es kann ja sein, dass der eine Thread gerade in der Funktion ist und dann ein anderer reinkommt.

mkinzler 6. Jan 2011 17:29

AW: Multithreading und Globale Funktionen
 
Das führt sogar mit großer Wahrscheinlichkeit zu Problemen.

generic 6. Jan 2011 17:35

AW: Multithreading und Globale Funktionen
 
Zitat:

Zitat von mkinzler (Beitrag 1072678)
Das führt sogar mit großer Wahrscheinlichkeit zu Problemen.

Wieso?

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.

Assarbad 6. Jan 2011 17:40

AW: Multithreading und Globale Funktionen
 
Zitat:

Zitat von generic (Beitrag 1072681)
Zitat:

Zitat von mkinzler (Beitrag 1072678)
Das führt sogar mit großer Wahrscheinlichkeit zu Problemen.

Wieso?

Ich denke er meinte den Aufrufer. Diese Funktion innerhalb eines Threads aufrufen sollte kein Problem sein. Aber aufgrund dieser einen Funktion kann man kaum eine Aussage treffen, bzw. die welche du gerade gemacht hast ...

schwa226 6. Jan 2011 17:46

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!

generic 6. Jan 2011 17:48

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.

schwa226 6. Jan 2011 17:52

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!?

messie 6. Jan 2011 18:01

AW: Multithreading und Globale Funktionen
 
Zitat:

Zitat von schwa226 (Beitrag 1072689)
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!?

Nee, selbst der Kopiervorgang kann während einer Bearbeitung fehlschlagen. Du musst die List während des Zugriffs schützen. Da gibt es verschiedene Möglichkeiten.
Suche mal nach "Thread synchronisieren". Stichworte sind Semaphoren, critical sections, Mutex

Grüße, Messie

generic 6. Jan 2011 20:53

AW: Multithreading und Globale Funktionen
 
In Delphi gibt es eine spezialisierte TList dafür.
TThreadList

schwa226 9. Jan 2011 15:04

AW: Multithreading und Globale Funktionen
 
Zitat:

Zitat von generic (Beitrag 1072769)
In Delphi gibt es eine spezialisierte TList dafür.
TThreadList

Danke für den Tipp!

Habe es nun eingebaut, jedoch geht es in einem Thread - im anderen nicht!?

Ich mache es so in den Threads:
Delphi-Quellcode:
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;
Es bleibt beim Locklist stehen.

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.
Seite 1 von 3  1 23      

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