Einzelnen Beitrag anzeigen

IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
80 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Ein Versuch mit Omnithreadlibrary

  Alt 21. Sep 2020, 07:05
Ich bin noch nicht ganz fertig, allerdings schon sehr müde davon.
Videos auf YT? Zu meinem Thema nicht eins was man als brauchbar bezeichnen kann. Sprich, ja ich habe mehrere auf Englisch geschaut.
Englische bringen auch was, das Problem ist nur, da kann ich gleich Muke dabei hören. Verstehen tue ich vielleicht 10 Prozent.
Ich kann nur das was ich sehe umsetzen.
Dokumentation beinhaltet heutzutage so gut wie gar keine Vorlagen, die man analysieren könnte.
Für einen Anfänger ist es sehr schwer zu Recht zu kommen.
Bitte schreibt mir keine Verweise auf YT oder Emba. Die Hilfe habe ich schon gesucht.

Neuer Versuch.
Das funktioniert zwar schon, allerdings ich verliere einige Ausgaben. Es fehlen Sachen, so als nicht alle Threads geliefert hätten.
Ich habe kein Plan, ob es am Server liegt der nicht antwortet, oder mein Code fehlerhaft ist. Momentan bin ich so überladen mit den Infos dass ich mich schon leicht verliere.

Ich kann es nicht in Echt testen, das ist mir zu riskant, ich habe mir auf Freespace halt eine Liste mit 1000 Datensätzen erstellt.
Darauf greife ich zu und versuche mein Vorhaben zu simulieren. Später wird es local auf dem Server passieren. Das kann ich aber noch nicht testen.

Delphi-Quellcode:
(* uses System.Threading;
  private
     FPool : TThreadpool;  *)

procedure TForm1.Button6Click(Sender: TObject);
var
  Task : ITask;
  Korrektur : string;
  Liste : TStringList;
begin
  Liste := TStringList.Create;
  Liste.LoadFromFile('LocaleDatei.dat');

  if FPool = nil then
    begin
      Fpool := TThreadPool.Create;
      Fpool.SetMaxWorkerThreads(10);
      Fpool.SetMinWorkerThreads(1);
    end;

  TParallel.For(0, Liste.Count - 1, procedure (Index: Integer)
    begin
      Task := TTask.Create(
        procedure
          begin
            if TTask.CurrentTask.Status = TTaskStatus.Canceled then
               exit;
           Korrektur := GetHTTP; // (function GetHTTP : string;) HIER VERBINDE ICH MICH PER GET AUF EINEN SERVER. HOLE EIN SATZ ALS STRING REIN

            if TTask.CurrentTask.Status <> TTaskStatus.Canceled then
              begin
                TThread.Queue(TThread.CurrentThread,
                  procedure
                    begin
                      if Assigned(Memo1) then
                        begin
                          Memo1.Lines.Add(Liste[Index]); // HIER WIRD SCHON FALSCH NUMMERIERT. ICH DENKE ABER WEIL ES NICHT SERIAL LÄUFT
                          Korrektur := StringReplace(Korrektur, 'Alter Wert', 'Neuer Wert' ,[rfReplaceAll, rfIgnoreCase]); //HIER WIRD NOCH MEHR PASSIEREN, DAS DIENNT NUR ALS MUSTER.
                          Memo1.Lines.Add(Korrektur); // HIER WIRD SPETER NOCH EIN UPLOAD GEMACHT. ERSTMAL UNWICHTIG. DIENT KONTROLLE
                        end;
                    end);
              end;
          end);
      Task.Start;
    end, FPool);
end;
Es sind sehr viele kleine Änderungen nötig. Serial dauert es ewig lange. Es muss schon mindestens 50-100 Mal parallel laufen. Am besten wählbar weil die Datenbanken unterschiedlich sind und der Rechner nicht immer unter Volllast laufen soll.
Meine Frage wäre eben ob es in der Form mit den Threads funktionieren kann.
Statt Queue könnte ich glaube ich Synchronize nehmen. Keine Ahnung was davon in meinem Fall besser ist.
Bitte um erneute Rückmeldung.

Geändert von IMPEGA (21. Sep 2020 um 07:52 Uhr)
  Mit Zitat antworten Zitat