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 2 von 3     12 3      
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#11

AW: Multithreading und Globale Funktionen

  Alt 9. Jan 2011, 14:13
Grundsätzlich musst Du die Aufrufe LockList/Unlocklist ein einem Resourcenschutzblock kapseln. Das geht so:
Delphi-Quellcode:
MyLocalList := TheThreadList.LockList;
Try
  DoSomethingWith(MyLocalList);
Finally
  TheThreadList.UnlockList;
End;
Natürlich hängt der zweite Thread im LockList. Nämlich genausolange, wie der erste Thread sein UnlockList noch nicht aufgerufen hat.
Mit dem Aufruf von "Locklist" öffnet Du die Tür zur Liste, zieht aber den Schlüssel von der Tür ab und macht hinter dir wieder zu.
"Unlocklist" verlässt die Liste, schließt wieder ab und hinterlässt den Schlüssel.

Der Aufruf von "LockList" wartet so lange, bis der Schlüssel wieder in der Tür steckt.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: Multithreading und Globale Funktionen

  Alt 9. Jan 2011, 14:19
Hallo,

wenn im anderen Thread die List gesperrt ist (locked)
dann kann der zweite Thread nicht darauf zugreifen.

Also nur die List sperren wenn Du darauf zugreifen willst.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
schwa226

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

AW: Multithreading und Globale Funktionen

  Alt 9. Jan 2011, 18:00
So schaut mein Thread (gekürzt) aus:
Delphi-Quellcode:
constructor TNames_thread.Create(const MainWindowHandle : Thandle);
begin
  inherited create(True); // CreateSuspended = true
  FMainHandle := MainWindowHandle;

  FreeOnTerminate := False;
end;


procedure TNames_thread.Execute();
var
  Msg : TMsg;
  List: TList;
  len : Integer;
begin
  while (not Terminated) do
  begin

      List := All_Names.Locklist;
      try
         len := List.Count;
      finally
         All_Names.Unlocklist;
      end;

    Sleep(1000);
  end; // while (not Terminated) do

  Terminate;
end;
Wenn der Thread nun das Locklist aufruft steht er!?
Das ist bei beiden Threads gleich.

Der was geht hat ja die OnUDPRead vom UDP Server und diese Funktion wird von einem andern Thread (TIdUDPListenerThread) ausgeführt. Dann kann das Locklist durchgeführt werden.

Die All_Names Liste wird in der Mainform in der OnCreate erzeugt.

EDIT:
Fehler gefunden!
Ich habe in der OnCreate im MainThread zuerst ein All_Names.Locklist.clear ausgeführt. danach aber kein Unlock!

Jetzt geht's!
Delphi 2010, Update 4 & 5

Geändert von schwa226 ( 9. Jan 2011 um 18:43 Uhr)
  Mit Zitat antworten Zitat
schwa226

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

AW: Multithreading und Globale Funktionen

  Alt 14. Feb 2011, 13:16
Jetzt habe ich noch eine Frage zu dem Thema, aber mit einer anderen Funktion:

Delphi-Quellcode:
function GetString(Data : TBytes):String;
var
  i : Integer;
begin
  Result := '';
  for i := 0 to High(Data) do
    Result := Result + IntToHex(Data[i], 2);
end;
Kann man sowas für Multithread verwenden? Oder wird da das Result zurückgesetzt wenn gerade ein Thread in der For Schleife ist und ein anderer die GetString ausführt?

Oder muss es dann so gemacht werden:
Delphi-Quellcode:
function GetString(Data : TBytes):String;
var
  i : Integer;
begin
  EnterCriticalSection(CS);
  try
    Result := '';
    for i := 0 to High(Data) do
      Result := Result + IntToHex(Data[i], 2);
  finally
    LeaveCriticalSection(CS);
  end;
end;
Ich will sozusagen einen Logger machen. Wenn ich nun CriticalSection verwende ist der eine Thread solange blockiert bis der andere Thread durch ist. Dies führt zu einer nicht gewollten Verzögerung wenn es jetzt um viele Daten geht.
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

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

AW: Multithreading und Globale Funktionen

  Alt 14. Feb 2011, 13:22
Das kommt auf die Daten an. Wenn diese Daten von mehreren Threads verändert/gelesen werden, muß eine Synchronisation stattfinden, ansonsten nicht. Es gibt zT sehr clevere Ansätze um parallel an großen Datensätzen zu arbeiten ohne daß sich die Threads in die Quere kommen.

Eine Frage hier wäre bspw., ob sich "Data" (durch einen anderen Thread) ändert, während es von dieser Funktion verarbeitet wird. Ohne weitere Infos kann man da keine konkreten Aussagen machen.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
schwa226

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

AW: Multithreading und Globale Funktionen

  Alt 14. Feb 2011, 13:30
Ne, Data gehört zu jedem Thread selber der die Funktion aufruft.
D.h. jeder Thread ruft die Funktion auf mit seinen eigenen privat deklariertden Data mit unterschiedlicher länge. Ich bin mir halt nicht sicher, wenn sich schon ein Thread in der Funktion befindet das Result von einem anderen Thread wieder mit dem Result :=''; wieder zurückgesetzt wird. Oder hat jeder Aufruf sein eigenes Result? Oder ob dadurch das High(Data) auch verbogen wird?
Lokale Variabeln gelten ja für jeden eigenen Aufruf/Thread selber.
Delphi 2010, Update 4 & 5

Geändert von schwa226 (14. Feb 2011 um 13:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

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

AW: Multithreading und Globale Funktionen

  Alt 14. Feb 2011, 13:38
Ne, Data gehört zu jedem Thread selber der die Funktion aufruft.
D.h. jeder Thread ruft die Funktion auf mit seinen eigenen privat deklariertden Data mit unterschiedlicher länge. Ich bin mir halt nicht sicher, wenn sich schon ein Thread in der Funktion befindet das Result von einem anderen Thread wieder mit dem Result :=''; wieder zurückgesetzt wird. Oder hat jeder Aufruf sein eigenes Result? Oder ob dadurch das High(Data) auch verbogen wird?
Ob High(Data) dort funktioniert kann ich ohne Testen nicht sagen, ich ging davon aus, daß dies nur bei bestimmten Arraytypen geht ... ansonsten sollte es keine Rolle spielen ob verschiedene Threads die gleiche Funktion aufrufen. Funktionen sind nur Code. Die Daten sind entweder auf dem Heap oder Stack, also vom Code getrennt ...

Lokale Variabeln gelten ja für jeden eigenen Aufruf/Thread selber.
Exakt. Jeder Thread hat seinen eigenen Stack und damit eigene Variablen.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
schwa226

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

AW: Multithreading und Globale Funktionen

  Alt 14. Feb 2011, 13:45
Ok, danke!

Dann werde ich das mal probieren und sehen ob es zu Exceptions kommt.

Mit dem "verbiegen" des High(Data) hatte ich gemeint, wenn der erste Thread z.B. mit Data[len=500] aufruft. Der zweite dann mit Data[len=3000]. Wenn nun auch i beim ersten Thread bis 2999 raufgezählt wird, dann gibt's natürlich Probleme weil der erste ja nur bis 499 geht.
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

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

AW: Multithreading und Globale Funktionen

  Alt 14. Feb 2011, 13:48
Mit dem "verbiegen" des High(Data) hatte ich gemeint, wenn der erste Thread z.B. mit Data[len=500] aufruft. Der zweite dann mit Data[len=3000]. Wenn nun auch i beim ersten Thread bis 2999 raufgezählt wird, dann gibt's natürlich Probleme weil der erste ja nur bis 499 geht.
Hab das schon verstanden. Aber gibt es denn keine Variante bei der du diese Daten explizit mitgeben kannst? Bspw. in Form von Parametern.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.167 Beiträge
 
Delphi 12 Athens
 
#20

AW: Multithreading und Globale Funktionen

  Alt 14. Feb 2011, 13:53
Bremst weniger aus.
Delphi-Quellcode:
function GetString(Data : TBytes):String;
var
  Temp: TBytes;
  i : Integer;
begin
  EnterCriticalSection(CS);
  try
    Temp := Copy(Data)
  finally
    LeaveCriticalSection(CS);
  end;
  Result := '';
  for i := 0 to High(Temp) do
    Result := Result + IntToHex(Temp[i], 2);
end;
Wobei ich mich immer frage, wie man auf soeine "kranke" Schleife kommt, mit soeiner Masse an langsamen Stringoperationen.
> Delphi-Referenz durchsuchenBinToHex

Abgesehn davon würde ich nicht den Data-Parameter auf dieser Seite absichern, sondern ich würde auf der aufrufenden Seite das absichern, welches man an Data übergibt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (14. Feb 2011 um 13:55 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 00:57 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