AGB  ·  Datenschutz  ·  Impressum  







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

Wie auf 2 Threads warten?

Ein Thema von C.Schoch · begonnen am 24. Apr 2006 · letzter Beitrag vom 25. Apr 2006
Antwort Antwort
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#1

Wie auf 2 Threads warten?

  Alt 24. Apr 2006, 23:13
Hi,
Ich möchte zuerst 2 Threads starten, auf deren Beendigung warten und dann einen weiteren starten und wiederum auf diesen warten und erst dann die Variable "i" hochzäheln.
Leider krieg ich das überhaupt nicht hin .

so funktionierts schonmal nicht, bekomme diverse Fehlermeldungen:

Delphi-Quellcode:
procedure TMainForm.btBackupClick(Sender: TObject);
var
  i : integer;
  hHandles : array[0..1] of THandle;
begin
  for i := 0 to lvSourceDestination.Items.Count - 1 do
  begin
    TtSearchSourceFiles.create(true);
    TtSearchDestFiles.create(true);
    TtSearchSourceFiles.sSourceDir := lvSourceDestination.Items[i].SubItems[0];
    TtSearchDestFiles.sDestDir := lvSourceDestination.Items[i].SubItems[1];
    TtSearchSourceFiles.Resume;
    TtSearchDestFiles.Resume;
    hHandles[0] := TtSearchSourceFiles.Handle;
    hHandles[1] := TtSearchDestFiles.Handle;
    case msgWaitForMultipleObjects(2,hHandles,true,INFINITE,QS_PAINT) of
    WAIT_OBJECT_0 + 0 and WAIT_OBJECT_0 + 1:
    begin
      TtSortFiles.Create(false);
    end
    end;
  end;
end;
Danke schon mal für die Hilfe
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Wie auf 2 Threads warten?

  Alt 25. Apr 2006, 14:59
Wenn dein Programm während des Laufs der (beiden) Threads sowieso blockiert (was WFMO ja verursacht) könntest du es auch so machen:
Delphi-Quellcode:
while (not Thread1.Terminated) or (not Thread2.Terminated) do
begin
  Application.ProcessMessages;
  Sleep(100);
end;
Entsprechend für die Einzelthreadversion anpassen, obwohl ich mich da frage, warum nen einzelnen Thread, auf den gewartet wird?

PS: Ich nehme mal an, TtSearchSourceFiles ist eine Variable. Dann erstellst du die aber mit TDeinThreadTypName.Create(), nicht DeinVariablenName.Create()
  Mit Zitat antworten Zitat
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Wie auf 2 Threads warten?

  Alt 25. Apr 2006, 18:07
Hi,
Hab das Tut. von Luckie schon durchgelesen.
es scheint nicht so richtig rübergekommen zu sein, wie ich das haben möchte.
Also nochmal:
Formular soll bedienbar bleiben zum z.B. abbrechen
Zitat:
Hauptthread // started alle 4 threads
| |
Thread1 Thread2 // laufen gleichzeitig
\ /
Thread3 // warted auf 1 und 2
|
Thread4 // warted auf 1, 2 und 3
habs jetzt mal vorerst mit Events gelöst.


Problem hab ich beim resumen vom Hauptthread aus
TtSearchSourceFiles.Resume Fehlermeldung:
Zitat:
E2076 Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt
Und beim übergeben der Variablen:
 TtSearchSourceFiles.sSourceDir := lvSourceDestination.Items[i].SubItems[0]; Fehlermeldung:
Zitat:
E2096 Methodenbezeichner erwartet
woran liegts? (bestimmt wieder an mir, aber ich steig durch die Fehlerbeschreibung(Hilfe) nicht durch )
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#4

Re: Wie auf 2 Threads warten?

  Alt 25. Apr 2006, 18:10
Delphi-Quellcode:
  MyThread.Resume;
  MyThread.WaitFor;

// nächste Aktion durchführen
Der Thread aus dem du MyThread startest wartet, bis MyThread wieder beendet ist und macht dann weiter.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Wie auf 2 Threads warten?

  Alt 25. Apr 2006, 19:53
Hi,
nach langem Probieren hab ichs hinbekommen und zwar so:

Oberflächen Unit:
Delphi-Quellcode:
procedure TMainForm.btBackupClick(Sender: TObject);
var
  i : integer;
begin
  for i := 0 to lvSourceDestination.Items.Count - 1 do
  begin
    TtSearchSourceFiles.create(true);
    TtSearchDestFiles.create(true);
    TtSearchSourceFiles(Self{[hier lag der Fehler!!}).sSourceDir := lvSourceDestination.Items[i].SubItems[0];
    TtSearchDestFiles([Self).sDestDir := lvSourceDestination.Items[i].SubItems[1];
    TtSearchSourceFiles([Self).Resume;
    TtSearchDestFiles(Self).Resume;
    TtSortFiles.Create(false);
  end
end;
Thread:
Den entscheidenden 3. Thread auf die ersten zwei per Event und WaitForMultipleObjects warten lassen.
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  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 07:28 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