Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread erstellen (https://www.delphipraxis.net/76209-thread-erstellen.html)

meg91 31. Aug 2006 12:21


Thread erstellen
 
hi
ich möchte in meinem Programm 3 Threads laufen lassen, welche jeweils 2 Zahlenwerte aus dem Main-Thread bekommen und dann selber, unabhänig von einander die Parallele Schnittstelle ansteuern sollen
das mit der Schnittstelle is kein Problem
nur ich hab keine Ahnung wie man Threads erstellen und denen Variabelen übergeben kann
hab mir schon sämtliche Tutorials durchgelsen, bin aber aus keinem wirklich schlau geworden

wäre sehr dankbar für einen kleinen Ansatz
Gruß
Markus

3_of_8 31. Aug 2006 12:38

Re: Thread erstellen
 
Da gibts irgendwo ein Tutorial und in Delphi gibts es dafür die Klasse Delphi-Referenz durchsuchenTThread

meg91 31. Aug 2006 12:56

Re: Thread erstellen
 
das habe ich auch schon durch
aber ich check nicht wie man das anlegen muss

gsh 31. Aug 2006 13:19

Re: Thread erstellen
 
geh im delphi auf Datei->Neu->Weitere->Thread-Objekt

und dann noch mit Alt+F11 (Unit verwenden) im Hauptforumlar einbinden

und dann kannst du es ganz einfach wie eine variable erstellen
Delphi-Quellcode:
var
  Thread : TThread;
begin
  Thread := TThread.Create(true);
  Thread.FreeOnTerminate := true; //Dann gibt sich der Thread selber frei
  Thread.Variable := Zahl; //Variable übergeben
  Thread.Resume; //Los gehts

  //Und dann das gleiche nochmal für den zweiten Thread
  Thread := TThread.Create(true);
  Thread.FreeOnTerminate := true;
  Thread.Variable := Zahl2;
  Thread.Resume;
end;

Pfoto 31. Aug 2006 13:29

Re: Thread erstellen
 
Wenn du die Threads für einen längeren Zeitpunkt (und immer wieder) einsetzen willst, dann wäre eine Jobliste genau das richtige.

Von "alzaimar" gab es da ein super Beispiel unter
DP: Thread and Jobs
Ganz bis unten hin scrollen, da ist auch ein Dateianhang.

Du kannst ganz nach deinen Bedürfnissen die Liste für Strings, Integer oder was auch immer modifizieren.


Gruß
Pfoto

meg91 31. Aug 2006 14:34

Re: Thread erstellen
 
@gsh:
ich hab das jetzt mal versucht so umzusetzen und ich bekommen immer die Fehlermeldung :'Abstrakter Fehler'

3_of_8 31. Aug 2006 15:41

Re: Thread erstellen
 
Du musst die Methoden des Threads überschreiben.

himitsu 31. Aug 2006 17:06

Re: Thread erstellen
 
> http://www.delphipraxis.net/internal...ct.php?t=91117
in der ..._sync.pas findest du 'nen Beispiel für die direkte Übergabe von Variablen.
Da wird ein Thread erstellt, die Variablen übergeben und der Thread danach gestartet (also TThread.Create(true) ist in diesem Zusammenhang ganz wichtig)

Es ist aber auch möglich den Constructor (Create) zu überschreiben, so daß man da die Variablen als Parameter übergeben kann.

meg91 31. Aug 2006 17:38

Re: Thread erstellen
 
also schon mal vielen Dank
endlich hab ichs geschafft was brauchbares zu basteln
aber trotzdem noch eine Frage:
Kann man den Thread auch einmal starten und dann als endlosschleife laufen lassen, bis man ihn wieder stoppt und wenn ja, dann wie?

Pfoto 31. Aug 2006 17:48

Re: Thread erstellen
 
Ich verweise nochmal auf mein Posting weiter oben, wo ich auf ein gutes Beispiel von alzaimar verweise.
Dort werden die Threads in einer Schleife gehalten und über eine Jobliste immer wieder mit Arbeit versorgt...
Gruß
Pfoto

meg91 1. Sep 2006 12:37

Re: Thread erstellen
 
Ich hab mich gestern und heute nochmal intensiv durch eure Vorschläge und Codes durchgearbeitet und ich habs tatsächlich geschafft 3 Threads zum laufen zu bringen
ich hab das ganze auch einfach mit 3 Variabelen die jeweils von einem Thread hochgezählt werden und es hat auch supi funktioniert
nur wie ich den LPT-Portzugriff eingebaut hab (ich versuche nämlich auf 3 DigiPorts vom LPT ein pulsweitenmoduliertes Signal auszugeben) hatte ich den eindruck, dass mein Programm gar nix mehr macht :-(

Delphi-Quellcode:
uses
  HW_Types, HW_32;
[...]
var

  b_LED1_1 : Byte;
  b_LED1_2 : Byte;
  b_LED1_on : Byte;
  b_max: Byte = 40;
  aThreads : TList;

implementation

{$R *.DFM}

uses SyncObjs;

Type


 T_LED1_Thread = Class (TThread)
  Private
    fID : Integer;
  Protected
    Constructor Create (aID : Integer);
    Procedure Execute;Override;
    End;

constructor T_LED1_Thread.Create(aID : Integer);
begin
  Inherited Create (True);
  fID := aID;
  Resume;
end;

procedure T_LED1_Thread.Execute;
begin
  While not Terminated do
  begin
        for b_LED1_1 := 0 to b_LED1_on do
          MainForm.HW32.Pin[2] := false; //not true
      if (b_max - b_LED1_on) > 0 then
        for b_LED1_2 := 0 to b_LED1_on do
          MainForm.HW32.Pin[2] := true; //not false
      Application.ProcessMessages;
  end;
end;

procedure TMainForm.B_OpenDriverClick(Sender: TObject);
begin
  aThreads := TList.Create;
  T_LED1_Thread.Create(0);
end;

procedure TMainForm.FormDestroy(Sender: TObject);
Var
  i : Integer;
begin
  While aThreads.Count > 0 do begin
    With T_LED1_Thread (aThreads[0]) do begin
      WaitFor;
      Free;
      End;
    aThreads.Delete(0);
    End;
  aThreads.Free;
end;

TKC 1. Sep 2006 12:58

Re: Thread erstellen
 
Hi,

Bist du sicher das die Threads nicht zugleich auf die Variablen b_LED1_1 und b_LED1_on .. usw zugreifen ?

Sowas solltest du entweder mit Syncronize oder locks machen :warn:

meg91 1. Sep 2006 13:16

Re: Thread erstellen
 
nein, weil ich habe für jeden Thread eigene Variabelen
ich hab ja nur einen Thread gepostet

himitsu 1. Sep 2006 13:27

Re: Thread erstellen
 
Die Threads greifen aber alle auf die selbe Schnittstelle zu?
(wenn auch auf verschiedene Pin)

meg91 1. Sep 2006 14:12

Re: Thread erstellen
 
Ja tun sie
stimmt is mir noch gar nicht bewusst gewesen
kann es daran liegen, dass gar nix an den Ausgängen passiert?

TKC 1. Sep 2006 16:28

Re: Thread erstellen
 
durchaus möglich .. probiers doch mal mit nur einem Thread .. wenns dann geht dann ist es ja klar.

meg91 1. Sep 2006 16:44

Re: Thread erstellen
 
aber ich wills doch in 3 threads laufen lassen, sonst ist doch das ganze sinnlos
meine Absicht war ja die Pulsweitenmodulation auf allen 3 Ports gleichzeitig laufen zu lassen, weil ich damit eine RGB-LED laufen lassen will

himitsu 1. Sep 2006 17:53

Re: Thread erstellen
 
PWM über 'nen arschlangsamen Port? :stupid:

da kommst du einfacher, wenn du einfach nur 'nen IC ansteuerst (Digitaler Wiederstand, oder PWM-Generator...)

meg91 3. Sep 2006 15:47

Re: Thread erstellen
 
ich habs aber schon mit einem Port versucht und da gehts wunderbar


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:29 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