AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Result als mehrdimensoiertes array im Thread

Result als mehrdimensoiertes array im Thread

Ein Thema von alfold · begonnen am 3. Jan 2017 · letzter Beitrag vom 4. Jan 2017
Antwort Antwort
Seite 2 von 2     12
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#11

AW: Result als mehrdimensoiertes array im Thread

  Alt 4. Jan 2017, 11:50
Mh, Result muss ja irgendwann mal die Größe bekommen!
also muss ich im getter Result bei der Abfrage vom Meinthread setzen.
Oder ich könnte Result vorher abfragen ob es schon gesetzt ist. Ob das geht, hab ich noch nicht getestet?

Ursache ist aber EXECUTE dort sind die daten nicht fix. Demzufolge auch nicht im Getter. Wie sich herraustellte. Warum keine Ahnung!
Bin noch am suchen

Den getter hab ich jetz erstmal ganz entfernt!
Gruß

Geändert von alfold ( 4. Jan 2017 um 12:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.123 Beiträge
 
Delphi 10.3 Rio
 
#12

AW: Result als mehrdimensoiertes array im Thread

  Alt 4. Jan 2017, 12:26
Dein Getter der die Werte abfragt kümmert sich nicht darum ob der Thread noch läuft...

Vielleicht leitest Du mal Deine Klasse von meinem mini-Threadhelper ab...

Mavarik...
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Result als mehrdimensoiertes array im Thread

  Alt 4. Jan 2017, 12:27
Übersichtlicher wäre es sicher, das Array im Mainthread zu erstellen und dem nebenläufigen Thread zu übergeben (MyThread := TMyThread.Create(MyArray) )

Den Zugriff musst Du aber auf jeden Fall absichern bzw. synchronisieren.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#14

AW: Result als mehrdimensoiertes array im Thread

  Alt 4. Jan 2017, 12:37
Danke für alles!
Fehler gefunden. Ich hab im Mainthread ausversehen den Thread 2x erstellt. Deswegen auch immer execute der Fehler daten da/nicht da.

Das Absichern kommt jetzt!
Synchronisieren mit den Mainthread? Nö
Hat seine Grund.

THX für Eure Bemühngen

Gruß Alfold
und damit keine offene Frage mehr.
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Result als mehrdimensoiertes array im Thread

  Alt 4. Jan 2017, 13:16
Also ich würde das in etwa so umsetzen:

Delphi-Quellcode:
unit newLwThread;

interface

uses
   Windows,
   Classes,
   SysUtils,
   Syncobjs;

type

   tarray = array [1 .. 4] of array of Boolean;

   TnewLwThread = class(TThread)
   private
      FEvent: TEvent;
      fFileList: array [1 .. 4] of TStringList;
      fisfilea: tarray; // array[1..4] of array of Boolean;
      fIsFileIndex: Integer;
      fIsListIndex: Integer;

      fLock: array [1 .. 4] of Tcriticalsection;

      procedure setFileList(index: Integer; const Value: TStringList);
      function Getfile: tarray;

   protected
      procedure Execute; override;

   public
      constructor Create;
      destructor Destroy; override;
      procedure ContinueWork;
      procedure Terminate;

      property Titel[index: Integer]: TStringList write setFileList;
      property isfile: tarray read Getfile;
   end;

implementation

{ TnewLwThread }

constructor TnewLwThread.Create;
var
   i: Integer;
begin
   inherited Create(true);
   FEvent := TEvent.Create(nil, false, false, '');
   for i := 1 to 4 do
      begin
         fFileList[i] := TStringList.Create;
         fLock[i] := Tcriticalsection.Create;
      end;
   FreeonTerminate := false;

end;

destructor TnewLwThread.Destroy;
var
   i: Integer;
begin
   ContinueWork;
   if not Terminated then
      begin
         Terminate;
         ContinueWork;
         WaitFor;
      end;
   for i := 1 to 4 do
      begin
         fFileList[i].Free;
         fLock[i].Free;
         SetLength(fisfilea[i], 0);
      end;
   FEvent.Free;
   inherited;
end;

procedure TnewLwThread.ContinueWork;
begin
   (* Event auf Signaled setzen *)
   FEvent.SetEvent;
end;

procedure TnewLwThread.setFileList(index: Integer; const Value: TStringList);
begin
   if index in [1 .. 4] then
      begin
         fLock[index].Enter;
         fFileList[index].Clear;
         fFileList[index].Assign(Value);
         SetLength(fisfilea[index], fFileList[index].Count);
         fLock[index].Leave;
      end;
end;

procedure TnewLwThread.Execute;
var
   i, x: Integer;
begin
   while not Terminated do
      begin
         if (FEvent.WaitFor(INFINITE) = wrSignaled) and not Terminated then
            begin
               // checkfile;
               for i := 1 to 4 do
                  begin
                     fLock[i].Enter;
                     try
                        if fFileList[i].Count > 0 then
                           begin
                              for x := 0 to fFileList[i].Count - 1 do
                                 begin
                                    if FileExists(fFileList[i].Strings[x]) then
                                       if not fisfilea[i][x] then
                                          fisfilea[i][x] := true
                                       else if fisfilea[i][x] then
                                          fisfilea[i][x] := false;

                                 end;
                           end;
                        // getfile;
                     finally
                        fLock[i].Leave;
                     end;
                  end;

            end;
      end;
end;

procedure TnewLwThread.Terminate;
begin
   inherited Terminate;
   FEvent.SetEvent;
end;

function TnewLwThread.Getfile: tarray;
var
   i, j: Integer;
begin
   for i := 1 to 4 do
      begin
         fLock[i].Enter;
         try
            SetLength(result[i], length(fisfilea[i]));
            for j := 0 to length(fisfilea[i]) - 1 do
               result[i, j] := fisfilea[i, j];
         finally
            fLock[i].Leave;
         end;
      end;
end;

end.
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#16

AW: Result als mehrdimensoiertes array im Thread

  Alt 4. Jan 2017, 13:33
Synchronisieren mit den Mainthread? Nö
Hat seine Grund.
Synchronisieren bedeutet nicht irgendeine Funktion aufzurufen, sondern sicher zu stellen, daß nicht zwei Threads gleichzeitig auf ein und den selben Speicherbereich zugreifen.

sollte sich das "nö" hierauf beziehen solltest Du u.U. dein Hobby wechseln.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Result als mehrdimensoiertes array im Thread

  Alt 4. Jan 2017, 14:17
PS: Reserviert SetLength evtl. sogar neuen Speicher, wenn sich die bisherige Größe dadurch gar nicht ändert? Bin hier unsicher.
SetLenght sorgt für ein UniqueArray. Wenn also aktuell mehrere Variablen auf dieses Array zeigen, dann legt SetLength eine neue Kopie an.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#18

AW: Result als mehrdimensoiertes array im Thread

  Alt 4. Jan 2017, 18:38
Synchronisieren mit den Mainthread? Nö
Hat seine Grund.
Synchronisieren bedeutet nicht irgendeine Funktion aufzurufen .....
sollte sich das "nö" hierauf beziehen solltest Du u.U. dein Hobby wechseln.

Gruß
K-H
Sorry ich dachte an synchronize mit den Mainthread
alles andere kommt jetzt dazu!

der Getter sieht jetzt so aus
Delphi-Quellcode:
function TLwThread.Getfile: tarray;
var
  i: Integer;
begin
    LwCS.Enter;
    try
       for i:= 1 to 4 do
       begin
             Result[i]:= Copy(fisfilea[i]);
       end;
    finally
      LwCS.Leave;
   end;
end;
@Fritzew
Macht das sinn für jedes Array ein CriticalSection?
Es wird eh einmal gelesen oder geschrieben? Zwischen durch darf kein anderer ran.

Gruß alfold
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: Result als mehrdimensoiertes array im Thread

  Alt 4. Jan 2017, 20:31
Zitat:
Macht das sinn für jedes Array ein CriticalSection?
Es wird eh einmal gelesen oder geschrieben? Zwischen durch darf kein anderer ran.
Wie stellst Du sicher das keiner ran will?
Das war einfach auf die Schnelle um das Prinzip darzustellen.

Sperren sollten immer so kurz wie möglich sein, das war mit den Stringlisten das kürzeste
Fritz Westermann
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:48 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