AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi nach beenden eines Threads, neuen starten
Thema durchsuchen
Ansicht
Themen-Optionen

nach beenden eines Threads, neuen starten

Ein Thema von ddcool · begonnen am 13. Feb 2008 · letzter Beitrag vom 13. Feb 2008
Antwort Antwort
ddcool

Registriert seit: 8. Jun 2003
146 Beiträge
 
Delphi XE2 Architect
 
#1

nach beenden eines Threads, neuen starten

  Alt 13. Feb 2008, 10:13
Hallo zusammen,

mir liegt da was ziemlich schwer im Magen und bekomme es nicht raus. Habe schon sämtliche Foren und Tutorials durchforstet = 0 Erfolg.
Ich habe eine Unit, in der ein Thread programmiert wurde. Beim starten wird diesem ein Wert übermittelt. Mit diesem Wert holt er sich in einer CriticalSection, Daten aus einem ListView der MainForm. Dieser werden dann vom Thread intern verarbeitet (netzwerkarbfagen, etc.) und in einer zweiten CriticalSection zurück in die ListView geschrieben. Soweit so gut.

jetzt mein Problem: Ich möchte immer 5 Threads gleichzeitig gestartet haben, um das ganze etwas flotter zu machen. Das klappt auch soweit ganz gut, nur möchte ich nachdem ein Thread fertig ist, einen neuen starten und genau da haperts bei mir.
Ich habe das ganze im moment mit einer prozedur in der MainForm versucht, die in einer CriticalSection gestartet wird und dann jeweils einen neuen Thread startet.

Hier mal mein Source:


MainForm:
Delphi-Quellcode:
var
  tmpthread: Array of TImportThread;

const
  maxthreads: Integer = 5;

procedure TfrmMain.StartThreads();
var
  i: Integer;
begin
  SetLength(tmpthread, maxthreads);
  for i := 0 to maxthreads-1 do
  begin
    if i < lstInfo.Items.Count then
    begin
      tmpthread[i] := TImportThread.Create(True,False,i,i);
      tmpthread[i].FreeOnTerminate := True;
      tmpthread[i].Resume;
    end;
  end;
end;

procedure TfrmMain.StartNextThread(num,lstid: Integer);
begin
  tmpthread[num].Terminate;
  tmpthread[num].WaitFor;
  if lstid < lstInfo.Items.Count-2 then
  begin
    tmpthread[num] := TImportThread.Create(True,False,num,lstid+1);
    tmpthread[num].FreeOnTerminate := True;
    tmpthread[num].Resume;
  end;
end;

und Thread:
Delphi-Quellcode:
procedure TImportThread.Execute;
begin
  CriticalSec.Enter;
  try
    // Hole Daten aus MainForm ...
  finally
    CriticalSec.Leave;
  end;

  // Verarscheite Daten ...

  CriticalSec.Enter;
  try
    // Schreibe Daten in MainForm ...
    frmMain.StartNextThread(threadid,listIndex);
  finally
    CriticalSec.Leave;
  end;
end;
Jedem thread wird also seine Id (von 0 bis maxthreads-1) übergeben und welche Zeile er in der ListView abfragen soll.
In StartNextThread wird Terminate aufgerufen und dann gewartet, bis der Thread beendet ist. Danach wird ein neuer Thread mit der gleichen Id über den "toten" eintrag im Array erzeugt und lediglich der ListView Wert um 1 erhöht.

Doch irgendwie ist da der Wurm drin. Vielleicht mag sich ja einer meines Problems/Source annehmen und Verbesserungvorschläge geben. Arbeite noch nicht so ewig lange mit Thread, bin also noch ein kleiner Newbie in dem Thema.


Vielen Dank & Grüße

ddcool
  Mit Zitat antworten Zitat
kaiser1401

Registriert seit: 6. Mär 2006
Ort: Gescher
157 Beiträge
 
Delphi 7 Professional
 
#2

Re: nach beenden eines Threads, neuen starten

  Alt 13. Feb 2008, 10:27
Hilft dir vll das OnTerminate Event von TThread weiter? dann musst du das nicht selber basteln an der Stelle.
inc(i);
  Mit Zitat antworten Zitat
ddcool

Registriert seit: 8. Jun 2003
146 Beiträge
 
Delphi XE2 Architect
 
#3

Re: nach beenden eines Threads, neuen starten

  Alt 13. Feb 2008, 11:19
Ja wunderprächtig. Hat alles geklappt. Da hätte ich mir ja gar nicht so die Seele aus dem Leibe reden brauchen.

Vielen Dank für diesen Tipp!
  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 04:40 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