AGB  ·  Datenschutz  ·  Impressum  







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

Ein Versuch mit Omnithreadlibrary

Ein Thema von IMPEGA · begonnen am 18. Sep 2020 · letzter Beitrag vom 19. Okt 2020
Antwort Antwort
IMPEGA
Online

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

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
generic

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

AW: Ein Versuch mit Omnithreadlibrary

  Alt 21. Sep 2020, 12:03
Das mit dem Youtube Videos können wir ändern
Ich werde mal schauen, dass ich den Vortrag von den Delphi-Tagen 2011 in ein Video verpacke.
Wenn ich ein Video mache, werde ich es in "Coding BOTT" veröffentlichen.

Die Folien hänge ich mal an, aber ohne die "Live"-Demos etwas ohne Informationen.
Angehängte Dateien
Dateityp: pdf omni-thread.pdf (273,8 KB, 25x aufgerufen)
  Mit Zitat antworten Zitat
IMPEGA
Online

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

AW: Ein Versuch mit Omnithreadlibrary

  Alt 21. Sep 2020, 15:32
Ich will nicht undankbar erscheinen, deine Antwort hat allerdings Null zu meinem Problem ausgesagt und geholfen genauso wenig.
Wenn ich mir dein Kanal anschaue finde ich auch Null über Threading.

Auf solche Antworten, selbst wenn Sie gut gemeint sind, kann ich gerne verzichten.
  Mit Zitat antworten Zitat
generic

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

AW: Ein Versuch mit Omnithreadlibrary

  Alt 22. Sep 2020, 10:40
Ich schreib das einfach mal anders, was ich meinte.

Danke für die Inspiration *demnächst* Videos über die OTL zu machen. Für ein 10 Minuten Video benötige ich ca. 2-3h Produktionszeit (Recherche, Demo bauen, Aufzeichnen, Schneiden, Hochladen, Verwalten). Das mache ich in meiner Freizeit und die ist knapp - Hunde und Ehefrau usw.. Also anderes gesagt, warte nicht auf das Video, weil das kommt frühestens in 4 Wochen, wenn überhaupt.


Inzwischen bin ich Zuhause und hab Zugriff auf dem Laptop, wo ich die Präsentation mit gemacht habe.
D.h. hier ist der Code zu den Folien.

Knackpunkte an deinem Code:
Das inc(fertig) ist nicht Threadsafe.
Weil das eine mehrteilige Operation ist:
1) Wert lesen
2) erhöhen
3) zurückschreiben

Ein anderer Task kann z.B. auch den Wert lesen, während der andere ihn bereits erhöht, aber noch nicht zurück geschrieben hat.

Siehe AtomicIncrement

Auf Liste.Delete(0), liste.count trifft das natürlich auch zu.

Siehe BlockingCollection

Das nächste Problem ist die Interaktion mit der Oberfläche. Das darf nicht mit anderen Threads gemacht werden.
Hier müsstest du mit den HauptThread synchronisieren.
Angehängte Dateien
Dateityp: 7z demo.7z (82,9 KB, 11x aufgerufen)
  Mit Zitat antworten Zitat
IMPEGA
Online

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

AW: Ein Versuch mit Omnithreadlibrary

  Alt 22. Sep 2020, 15:56
Ok, das klingt ganz anders.
Danke sehr, auch für deine Demo.
Momentan bin ich so überladen mit Information, dass ich erst mal Zeit zum Verdauen brauche.
Mein Problem habe ich zwar noch nicht gelöst, es scheint aber etwas komplizierter zu sein als ich gedacht habe.
Leider ist es sehr zeitintensiv. Davon hat man leider immer zu wenig.
Lesen, lesen, lesen, danach starte ich neuen Versuch.
Danke für eure Unterstützung.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#6

AW: Ein Versuch mit Omnithreadlibrary

  Alt 22. Sep 2020, 17:37
Möchtest du unbedingt was lernen oder ein Problem lösen? Ich habe vor Jahren mit AsyncCalls von Andreas Hausladen angefangen, das ist deutlich weniger anspruchsvoll und tut seinen Dienst nach wie vor sehr gut. Ich habe versucht bzw. bin dabei, auf OTL zu wechseln, bin aber auch erschlagen von den vielen Möglichkeiten und der Komplexität.
  Mit Zitat antworten Zitat
IMPEGA
Online

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

AW: Ein Versuch mit Omnithreadlibrary

  Alt 22. Sep 2020, 20:23
@Benmik
Eigentlich beides. Ich erfinde eine Aufgabe und dann versuche ich so weit es geht zu lernen bis ich Sie gelöst habe.
In diesem Fall ist eher die Lösung für mich wichtiger, allerdings komme ich damit nicht klar.
Das Problem ist noch komplexer. Ich verbinde mich auf den Server. Das erschwert das Ganze.
Ich habe zwar eine Lösung in D7. Das kann ich auch für mein Projekt übernehmen, ich wollte aber unbedingt OTL oder Threading in Tokyo nutzen. Um es halt zu lernen.
Momentan bin ich aber überladen und ziemlich satt. Dafür dass es nur mein Hobby ist, investiere ich eh schon zu viel Zeit dafür. Ich habe mir das einfacher ausgemalt.
Danke aber für jeden Tipp. Ich komme darauf sicherlich zurück. Ich bin zwar mit cwRuntime-master schon sehr weit gekommen, das erschien mir einfacher.
Tja, bis auf. Abbrechen funktioniert nicht ganz und die Ergebnisse stimmen nicht. So als ob er nicht gewartet hätte bis eine Response geliefert wird.
Wie gesagt, bin gerade überladen. Greife es später an.
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz