AGB  ·  Datenschutz  ·  Impressum  







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

Threads nacheinander ausführen

Ein Thema von TheMiller · begonnen am 1. Feb 2009 · letzter Beitrag vom 2. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Threads nacheinander ausführen

  Alt 1. Feb 2009, 23:01
Hallo,

arbeite mal wieder ein bissl mit Threads. Möchte Downloads von Dateien durchführen. Diese Daten sollen nacheinander geladen werden und nicht parallel. Momentan werden die Threads gleichzeitig gestartet und demnach laufen sie auch parallel. Hier mal mein Code:

(Dies ist ein Auszug aus meiner "Updater-Unit")

Delphi-Quellcode:
  TDownloadUpdate = class(TThread)
  private
    fFile: String;
    fUrl: String;
    fParent: HWND;
    procedure SetFile(Value: String);
    procedure SetUrl(Value: String);
  public
    Done: Boolean;
    constructor Create;
  protected
    procedure Execute; override;
  published
    property File2Load:String read fFile write SetFile;
    property Url: String read fUrl write SetUrl;
  end;

procedure TDownloadUpdate.Execute;
var
  www: TIdHttp;
  fs: TFileStream;
begin
  inherited;
  www:=TIdHttp.Create(nil);
  [url]www.Port:=81;[/url] // Nur testweise, da Apache auf 81 lauscht.
  try
    try
      ForceDirectories(ExtractFilePath(ParamStr(0))+'\Updates\');
      fs:=TFileStream.Create(ExtractFilePath(ParamStr(0))+'Updates\'+fFile, fmCreate);
      www.Get(fUrl, fs);
    except
      //
    end;
  finally
    [url]www.free;[/url]
    fs.Free;
  end;
end;

procedure TUpdater.DownloadUpdate(i: Integer);
var
  du: TDownloadUpdate;
begin
  du:=TDownloadUpdate.Create();
  with (du) do
  begin
    FreeOnTerminate:=True;
    SetFile(GetUpdateInfo(i, 'filename'));
    SetUrl(GetUpdateInfo(i, 'url'));
    Resume;
  end;
end;
(hier die Hauptanwendung)

Delphi-Quellcode:
procedure TForm1.StartUp;
begin
  Updater:=TUpdater.Create;
  Updater.SeekUpdates('http://127.0.0.1/test/updates.ini', Self.Handle);
end;

procedure TForm1.PngBitBtn2Click(Sender: TObject);
begin
  Updater.DownloadUpdate(0);
  Updater.DownloadUpdate(1);
end;
Vielen Dank im Voraus!
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Threads nacheinander ausführen

  Alt 1. Feb 2009, 23:04
Wenn es nacheinander sein soll, brauchst eigentlich keine Threads oder nur einen
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#3

Re: Threads nacheinander ausführen

  Alt 1. Feb 2009, 23:09
Das verstehe ich nicht ganz. Ich lager das in Threads nur aus, damit das Programm nicht einfriert und ich kein Application.ProcessMessages verwenden muss.

Mehrere Threads habe ich, damit ich auch einzelne Dateien (und nicht alle) runterladen muss. Weiterhin möchte ich pro Datei Downloadstatus und weitere Infos anzeigen.
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Threads nacheinander ausführen

  Alt 1. Feb 2009, 23:12
Würde es nicht reichen, einem Thread alle Dateien, die runtergeladen werden sollen, zu übergeben und der diese nacheinander runterlädt?
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Threads nacheinander ausführen

  Alt 1. Feb 2009, 23:21
Delphi-Quellcode:
function MyWaitFor(Event: THandle): Boolean; // von negaH: [url]http://www.delphipraxis.net/post696510.html#696510[/url]
begin
  Result := False;
  while not Result do
    case MsgWaitForMultipleObjects(1, Event, False, INFINITE, QS_ALLINPUT) of
      WAIT_OBJECT_0:
        Result := True;
      WAIT_OBJECT_0 + 1:
        begin
          Application.ProcessMessages;
          if Application.Terminated then Exit;
        end;
    else
      RaiseLastWin32Error;
    end;
end;

constructor TDownloadUpdate.Create(aFilename, aURL: string; aFinishEvent: Cardinal);
begin
  inherited Create(True);
  fFile := aFilename;
  fUrl := aURL;
  fFinishEvent := aFinishEvent;
  FreeOnTerminate := True;
  resume;
end;

procedure TDownloadUpdate.Execute;
var
  www: TIdHttp;
  fs: TFileStream;
begin
  inherited;
  www:=TIdHttp.Create(nil);
  [url]www.Port:=81;[/url] // Nur testweise, da Apache auf 81 lauscht.
  try
    try
      ForceDirectories(ExtractFilePath(ParamStr(0))+'\Updates\');
      fs:=TFileStream.Create(ExtractFilePath(ParamStr(0))+'Updates\'+fFile, fmCreate);
      www.Get(fUrl, fs);
    except
      //
    end;
  finally
    [url]www.free;[/url]
    fs.Free;
    SetEvent(fFinishEvent);
  end;
end;

procedure TUpdater.DownloadUpdate(i: Integer);
var
  Event: THandle;
begin
  Event := CreateEvent(nil, False, False, 'ThreadFinished');
  TDownloadUpdate.Create(GetUpdateInfo(i, 'filename'), GetUpdateInfo(i, 'url'), Event);
  MyWaitFor(Event);
  CloseHandle(Event);
end;
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#6

Re: Threads nacheinander ausführen

  Alt 1. Feb 2009, 23:22
Hm.. das wäre sicherlich eine gute Alternative. Würde sich in meinem Projekt auch realisieren lassen. Aber ich würde trotzdem gerne wissen, wie ich Threads nacheinander laufen lassen kann. Einfach auch Interesse.

Roter Kasten: Ok, super Werde ich dann auch mal ausprobieren. Danke!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Threads nacheinander ausführen

  Alt 1. Feb 2009, 23:27
Man könnte mit MSDN-Library durchsuchenWaitForSingleObject auf die Beendigung eines Threads warten und dann den nächsten starten.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Threads nacheinander ausführen

  Alt 2. Feb 2009, 07:39
Ich würde das straight-forward machen, genauso wie Du es willst:

Threads nacheinander ausführen = Thread Nr.X startet Thread Nr.(X+1)

Du erstellst Dir eine Liste aller Threads und sorgst dafür, das ein Thread beim Beenden (OnTerminate) den nächsten Thread aktiviert.
Delphi-Quellcode:
Var
  MyThreadList : TList; // Of Threads
  CurrentThread : TMyThread;

Procedure TMainForm.RunNextThread (Sender : TObject);
Begin
  If MyThreadList.Count>0 Then Begin // Wenn noch Threads abzuarbeiten sind,
    CurrentThread := TMyThread(MyThreadList[0]); // nimm den nächsten,
    MyThreadList.Delete(0); // entferne ihn aus der Liste
    CurrentThread.Resume; // und führe ihn aus
  End
  Else Begin
    ShowMessage('Alle Threads wurden ausgeführt');
    FreeAndNil (MyThreadList);
  End;
End;
    
Procedure TMainForm.ExecuteAllThreads;
Var
  i : Integer;
  myThread : TMyThread;

Begin
{$IFDEF AllowAddingOfThreadsWhileExecuting}
  If Assigned (MyThreadList) Then
    Raise Exception.Create('Es sind noch nicht alle Threads abgearbeitet');
{$ELSE}
  If Not Assigned (MyThreadList) Then
    MyThreadList := TList.Create;
{$ENDIF}
  For i:=0 to MyThreadCount do Begin
    myThread := TMyThread.Create (...); // Suspended muss TRUE sein.
    myThread.OnTerminate := RunNextThread;
    myThread.FreeOnTerminate := True; // Kannst du so machen oder nicht.
    MyThreadList.Add(myThread);
  End;
  RunNextThread(nil);
End;
So kannst Du dir das 'warten auf den nächsten Thread' sparen. Die Variable 'CurrentThread' benötigst Du, wenn Du die Anwendung beenden willst, und noch nicht alle Threads abgearbeitet sind. Dann Terminierst Du den 'CurrentThread' und löschst einfach die MyThreadList.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#9

Re: Threads nacheinander ausführen

  Alt 2. Feb 2009, 08:43
Morgen!

@alzaimar: Genau so habe ich es gemacht, doch das Event OnTerminate wurde nie ausgeführt. Und, btw, wenn den Ihnalt der Execute-Funktion in eine andere Funktion auslagere (zB Download) und diese im Execute mit Synchronize aufrufe, dann wird diese garnicht gestartet. Vielleicht hängt das irgendwie zusammen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Threads nacheinander ausführen

  Alt 2. Feb 2009, 09:18
Zitat von alzaimar:
Ich würde das straight-forward machen, genauso wie Du es willst:

Threads nacheinander ausführen = Thread Nr.X startet Thread Nr.(X+1)
wieso denn nicht eine Liste aller zu ladender Dateien EINEM Thread geben, welcher diese Liste dann selber nacheinander abarbeitet?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:27 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