![]() |
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 |
Re: Thread erstellen
Da gibts irgendwo ein Tutorial und in Delphi gibts es dafür die Klasse
![]() |
Re: Thread erstellen
das habe ich auch schon durch
aber ich check nicht wie man das anlegen muss |
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; |
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 ![]() 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 |
Re: Thread erstellen
@gsh:
ich hab das jetzt mal versucht so umzusetzen und ich bekommen immer die Fehlermeldung :'Abstrakter Fehler' |
Re: Thread erstellen
Du musst die Methoden des Threads überschreiben.
|
Re: Thread erstellen
>
![]() 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. |
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? |
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 |
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; |
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: |
Re: Thread erstellen
nein, weil ich habe für jeden Thread eigene Variabelen
ich hab ja nur einen Thread gepostet |
Re: Thread erstellen
Die Threads greifen aber alle auf die selbe Schnittstelle zu?
(wenn auch auf verschiedene Pin) |
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? |
Re: Thread erstellen
durchaus möglich .. probiers doch mal mit nur einem Thread .. wenns dann geht dann ist es ja klar.
|
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 |
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...) |
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