AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Multithreading und Globale Funktionen
Thema durchsuchen
Ansicht
Themen-Optionen

Multithreading und Globale Funktionen

Ein Thema von schwa226 · begonnen am 6. Jan 2011 · letzter Beitrag vom 14. Feb 2011
Antwort Antwort
Seite 1 von 3  1 23      
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#1

Multithreading und Globale Funktionen

  Alt 6. Jan 2011, 16:26
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.
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Multithreading und Globale Funktionen

  Alt 6. Jan 2011, 16:29
Das führt sogar mit großer Wahrscheinlichkeit zu Problemen.
Markus Kinzler
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Multithreading und Globale Funktionen

  Alt 6. Jan 2011, 16:35
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#4

AW: Multithreading und Globale Funktionen

  Alt 6. Jan 2011, 16:40
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 ...
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#5

AW: Multithreading und Globale Funktionen

  Alt 6. Jan 2011, 16:46
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!
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Multithreading und Globale Funktionen

  Alt 6. Jan 2011, 16:48
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#7

AW: Multithreading und Globale Funktionen

  Alt 6. Jan 2011, 16:52
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!?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Multithreading und Globale Funktionen

  Alt 6. Jan 2011, 17:01
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
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#9

AW: Multithreading und Globale Funktionen

  Alt 6. Jan 2011, 19:53
In Delphi gibt es eine spezialisierte TList dafür.
TThreadList
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#10

AW: Multithreading und Globale Funktionen

  Alt 9. Jan 2011, 14:04
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.
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:24 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