![]() |
multithreading funktioniert nicht
Hiii^^
habe ein Programm erstellt, dass bestimmte Pixel solange abfragt, bis eine boolsche bedingung true is also ca. so:
Delphi-Quellcode:
wenn ich das starte funktioniert auch alles! nur das programm is während der repeat-schleife nicht ansprechbar... da es aba mehrere procedures durchführen soll is das schlecht!
var bool:Boolean;
begin repeat ..... //Die Pixel sind Tcolor und werden hier immer wieder abgefragt ... bool:=(Pixel1 = Pixel2) and (Pixel3 = Pixel 4); until (bool); habe mir gedacht ein Thread würde helfen: hab mich schlau gemacht und thread erstellt... thread funktioniert auch soweit nur bleibt der Hauptthread (VCL) und allgemein das ganze Programm wieder während der repeat-schleife stehn... funktioniert also der wechsel zwischen den threads nicht oder liegt ein Deadlock vor? synkronisiert hab ich bisher nix^^ habs aba scho oft ausprobiert (ohne erfolg)... hier mein Thread: alles aus einem Thread-Tutorial ![]()
Delphi-Quellcode:
also habe heute zum ersten ma Thread in diesem zusammenhang gehört!! und hab deswegen kein plan warum es nich klappt ohne, dass der VCL stehn bleibt... neue exe is ne möglichkeit müsste aba dann variablen versenden etc und ich hätte 2 exe-dateien :pale:
type
TBinFertig = procedure(const Content: String) of object; TMyOwnThread = class(TThread) protected MediaPlayer1: TMediaPlayer; CB1: TCheckBox; CB2: TCheckBox; CB3: TCheckBox; CB4: TCheckBox; procedure Execute; override; private FBinFertig: TBinFertig; procedure SyncBinFertig; public property BinFertig: TBinFertig read FBinFertig write FBinFertig; end; ... var MyOwnThread: TMyOwnThread ; implementation {$R *.dfm} procedure TMyOwnThread.SyncBinFertig; //weiß damit nix anzufangen, da keine andere porcedure auf zB meine //Checkbox im Form1 (CB1) zugreift begin end; procedure TMyOwnThread.Execute; begin try bool:=false; lDC:= GetDC(0); if lDC> 0 then repeat Pixel[1]:= GetPixel(lDC, 554, 138); // hier frag ich einfach die Pixelfarbe von einem Array of TColor ab if Form1.CB1.Checked=true then // geht auch... also diese Checkbox zu checken 0o bool:=((bool) or x); if Form1.CB2.Checked=true then bool:=((bool) or y); if Form1.CB3.Checked=true then bool:=((bool) or z); if Form1.CB4.Checked=true then bool:=((bool) or a); until bool; //an der endlosschleife bleibt alles hängen es soll aba nur dieser Thread arbeiten NICHT VCL Form1.MediaPlayer1.Play except on e: exception do begin showmessage('blaa'); end; end; end; procedure TSilkroadOnlineTool.Button5Click(Sender: TObject); var Thread: TMyOwnThread; begin Thread := TMyOwnThread.Create(True); Thread.Resume; Thread.Suspend; Thread.Terminate; Thread.Execute; end; end. also HELFT mir :mrgreen: plz vielen Dank im voraus :thumb: |
Re: multithreading funktioniert nicht
Hallo
Delphi-Quellcode:
Überprüfe nicht auf = true. Das mag hier zwar gehen, ist jedoch schlecht, sich das so anzugewöhnen. Wieso, steht
if Form1.CB1.Checked=true then
![]() Du greifst jedoch im Thread (Execute) direkt auf die VCL zu beim Ansprechen der CheckBoxen und das ist alles andere als gut. Genauso beim TMediaPlayer. Der Zugriff auf die VCL aus einem Thread sollte generell nur mittels ![]() Mir persönlich erscheint es auch nicht sinnvoll, in jedem Schleifendurchlauf zu prüfen, welche CheckBox nun gesetzt ist, denn das kostet auch nur Rechenzeit, jedesmal auf die VCL zugreifen zu müssen. Vielleicht wäre es auch sinnvoll, einzulesen, welche CheckBoxen gesetzt sind und den Thread dann mit entsprechenden Parametern zu starten, es sei denn, man soll während des Threads auch eine CheckBox anklicken dürfen und die Änderungen direkt übernommen werden müssen. Falls das ganze für eine Visualisierung sein soll, tust du dir sicher leichter, wenn du die bass.dll nutzen würdest. Für diese dll gibt es einige Units und Beispiele in der DP, mit denen sich diese sehr einfach ansprechen lässt. Visualisierungen sind damit ein Kinderspiel. Eine nette Übung ist es natürlich, selbst eine zu schreiben, das ist keine Frage. :) |
Re: multithreading funktioniert nicht
Zitat:
Delphi-Quellcode:
... hier knallts dann endgültig.
Form1.MediaPlayer1.Play
Zitat:
Wie startet man einen Thread? a) Man ruft den Konstruktor mit dem Parameter 'False' auf (der steuert, ob der Thread bei der Geburt schläft oder gleich losbrüllt) b) Man weckt ihn explizit mit 'Resume' oder 'Suspended := False' auf. |
Re: multithreading funktioniert nicht
JAAA :mrgreen: :mrgreen: es geht^^ DANK an euch !!!
habe den thread mit
Delphi-Quellcode:
aufgerufen und die CheckBoxen und RadioButtons und Mediaplayer komponente nur in Form1 deklariert...
Thread := TMyOwnThread.Create(True);
Thread.suspended:=false; außerdem habe bin ich dann dem deadlock ausgewichen^^ indem ich am schluss, wo er die mediaplayer komponente abspielen soll (Form1.MediaPlayer1.Play) synkronisiert habe... jedenfalls funktioniert jetzt alles^^ THXX |
Re: multithreading funktioniert nicht
Wenn Du im Konstruktor keinerlei Vorkehrungen treffen musst, dann kannst du den Thread auch mit 'True' im Konstruktor aufrufen, dann rattert er gleich los.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 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