AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Liste Thread sicher abholen

Ein Thema von oki · begonnen am 9. Jun 2008 · letzter Beitrag vom 10. Jun 2008
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

Liste Thread sicher abholen

  Alt 9. Jun 2008, 20:03
Hi Leute!

ich bin mir bei meinem aktuellen Thema nicht ganz sicher wie ich es angehen soll. Folgende Voraussetzung:
Ich habe eine eigene Klasse mit dem Vorfahren TThread. Diese Klasse besitzt eine Public-Eigenschaft WindowList vom Typ TStringList. Der Thread aktualisiert diese Liste fortlaufend in seiner Execute-Methode.
Nun möchte ich mit meiner Anwendung den Inhalt der Liste abholen. Ich habe den Verdacht, dass das so einfach nicht geht wenn ich die Liste öffentlich mache und dann durch die Items iteriere um alles auszulesen. Mein Thread könnte da ja was in der Zwischenzeit ändern. Ein Ereignis mittels Synchronize will ich aber auch nicht aus dem Thread losschicken, da es nicht nötig ist die Anwendung zu informieren.

Hier mal der Code zur Klassendeklaration:

Delphi-Quellcode:
type
  TShutDownThread = class(TThread)
  private
    FWindowList : TWindowList; // Liste der aktiven Fenster
    FShutDownList : TShutDownList; // Schließliste
    function GetWinParamObj(index: Integer): TWinParamClass;
    function GetShutDownObj(index: Integer): TWinParamClass;
  protected
    procedure Execute; override;
    procedure UpdateWindowList; // Fensterliste aktualisieren
  public
    constructor Create(CreateSuspended: Boolean); reintroduce; virtual;

    property ShutDownList : TShutDownList read FShutDownList;
    property ShutDownObj [index : Integer] : TWinParamClass read GetShutDownObj;
    property WindowList : TWindowList read FWindowList;
    property WinParamObj [index : Integer] : TWinParamClass read GetWinParamObj;
  end;
Ich glaube, dass sollte Ärger geben:
Delphi-Quellcode:
  For Counter := 0 to ShutDownThread.WindowList.Count - 1 do begin
    Obj := ShutDownThread.WindowList.Objects[Counter];
    ... und dann lesen wir schön aus und zeigen an
  end;
Sorry, hab grad versehentlich den absenden Button gedrückt. Hier noch schnell der Rest.

Ich dächte, dass geht in die Hose. Die Frage ist nun, wie sollte ich die Items threadsicher aus dem Thread holen?

Gruß oki

[edit] nach Hinweis von sirius Fehler im Code gefixt! [/edit]
42
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Liste Thread sicher abholen

  Alt 9. Jun 2008, 20:09
Ja, das funktioniert nicht. Das beste ist, wenn du eine Critical Section einführst, die immer beim Bearbeiten der Liste betreten wird. Beim Auslesen solltest du die Section betreten, den Inhalt an eine neue Liste assignen und die Section verlassen und danach mit der neuen Liste weiterarbeiten, damit der Thread nicht zu lang aufgehalten wird.
Interessant könnten für dich auch einfach verkettete Listen sein, da man diese ganz ohne Critical Sections threadsicher bearbeiten kann - es werden nur die Interlocked-Funktionen benötigt.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Liste Thread sicher abholen

  Alt 9. Jun 2008, 20:17
Hi,

das war zu schnell.

Das mit dem Assign hatte ich mir auch schon überlegt. Etwa so:
Delphi-Quellcode:
procedure TShutDownThread.AssignWindowList(AList : TWindowList);
begin
  AList.Assign(FWindowList);
end;
Das geht sicher schneller, aber ist genau so'n Blödsinn. Was meinst du mit Critical Section? Beim Eintritt in die Procedure den Thread anhalten (Suspent) und nach Assign Resume?

Gruß
42
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Liste Thread sicher abholen

  Alt 9. Jun 2008, 20:24
Oben redest du von der FWindowList und in deinem Beispiel ist es Shutdownlist

Je nach Inhalt der Liste, wäre vielleicht eine TThreadList etwas für dich.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Liste Thread sicher abholen

  Alt 9. Jun 2008, 20:24
Nein, ich meine eine Critical Section - das ist ein Objekt, dass von Windows zur Verfügung gestellt wird, in der Unit SyncObjs befindet sich eine Kapselung. Die Funktionsweise ist einfach: Wenn du eine Critical Section betreten willst, die schon ein anderer Thread besitzt, fällt der Thread in einen Wartezustand, der erst aufgehoben wird, wenn der Thread im Besitz der Critical Section sie genau so oft verlassen wir betreten hat (die Aufrufe können also durchaus gestapelt werden). Damit kannst du also kritische Abschnitte wie das Assign und das Bearbeiten der Liste schützen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Liste Thread sicher abholen

  Alt 9. Jun 2008, 20:28
@sirius: Danke fur den Hinweis. Es soll natürlich die TWindowList sein. Blöder Fehler. Ich korrigiere das gleich.

@Apoll....: Da muss ich mal kurz die Hilfe bemühen. Scheint echt ne Bildungslücke bei mir zu sein. Melde mich wenn der Nebel weg ist.

Gruß oki
42
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Liste Thread sicher abholen

  Alt 9. Jun 2008, 20:45
Hi sirius noch mal.

Ich stell mich im moment etwas schwerfällig an, aber was hilfts. Mir ist gerad nicht so richtig klar wie ich die ThreadList werwenden soll. Vieleicht denk ich auch zu kompliziert.

Einfach gedacht wurde ich es so machen.

Mein Thread ist ok, meine TWindowList ist ein Nachkomme von TThreadList und immer wenn ich die Einträge auslesen will mache ich folgendes:
Delphi-Quellcode:
procedure TShutDownThread.AssignWindowList(AList : TWindowList);
begin
  FWindowList.LockList;
  AList.Assign(FWindowList);
  FWindowList.UnlockList;
end;
@Apoll...:
Das mit dem Critical Section hört sich irgentwie gewaltig an. Macht sicher Eindruck und ist ein prodessioneller Weg, sieht aber im Moment so aus, als ob das umfangreicher wird als das was ich eigentlich nur machen will. Bis jetzt hab ich nur Einträge aus dm MSDN gefunden, und das sah nicht wie so eben mal schnell gemacht aus. Ich forsch da aber mal weiter. Dem Hinweis mit der Unit SyncObjs muß ich noch nachgehen.

gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Liste Thread sicher abholen

  Alt 9. Jun 2008, 21:01
Ja, das ist soweit ok, wenn du auch das Einfügen mit TThreadList.add machst.
mit Locklist bekommst du übrigens auch direkt einen Zeiger auf die Liste darunter.

Kommt auch alles darauf an, was du für Sachen in der Liste hast. Denn ein Assign kopiert ja erstmal nur die Zeiger und nicht dessn Inhalt.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#9

Re: Liste Thread sicher abholen

  Alt 9. Jun 2008, 21:07
Critival Sections sind nicht kompliziert. Du brauchst nur eine Variable und vier Funktionen:

Delphi-Quellcode:
var
  mySection: RTL_CRITICAL_SECTION;
Einmalig rufst du folgendes auf:
InitializeCriticalSection(mySection); Den Zugriff auf die Liste machst du in diesem Konstrukt:
Delphi-Quellcode:
EnterCriticalSection(mySection);
try
  //....
finally
  LeaveCriticalSection(mySection);
end;
Und zum Abschluss folgt dies:
DeleteCriticalSection(mySection);
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Liste Thread sicher abholen

  Alt 9. Jun 2008, 21:08
Klar, ich hatte mir natürlich gedacht, dass ich im Execute ein LockList ausführe wenn ich die Liste bearbeite und ein UnlockList, wenn ich fertig bin. Das mit dem Assign-Beispiel war jetzt nur der Einfachheit halber.

Das blöde ist, dass meine WindowList eine StringList ist. Ich hatte mir aber schon gedacht die WindowList und die ShutDownList als ListItems in die ThreadList zu legen.

Gruß oki
42
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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:39 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