![]() |
Brauche Hilfe zu Threads
Habe als totaler Delphi(5)-Laie meine Wanduhr fotografiert und daraus eine analoge Uhr gebastelt. Funktioniert.
Sobald ich aber das Pendel zufügen will, geht nur entweder die Uhr oder das Pendel. Möchte das Pendel evtl. mit Timer2 in einem zweiten Thread laufen lassen, komme aber damit nicht zurecht. (Pendelstab mit LineTo, Pendelscheibe ist wieder eine 24k große BMP.) Könnte Pendel auch als AVI laufen lassen. Aber wie kriege ich das eine oder das andere in einen Thread? Die Anleitung von M.Puff kann ich nicht umsetzen. Für eine konkrete Hilfe wäre ich sehr dankbar, weil ich über eigene Beispiele am besten lerne. Oldjoe (Baujahr37) |
Re: Brauche Hilfe zu Threads
Mit Threads geht das kaum, denn man sollte nur vom Hauptthread auf die VCL zugreifen. Was spricht denn gegen einen Timer für die Zeiger und einen für das Pendel?
|
Re: Brauche Hilfe zu Threads
Mit zwei Timern habe ich es schon probiert, gleicher Effekt.
Ich vermute, dass Uhr und Pendel sich gegenseitig stören, wenn sie in einem einzigen Thread laufen. (Zugriffsverletzungen). |
Re: Brauche Hilfe zu Threads
Zeige mal den Code von den Timern. Und vergiss bitte die Threads, denn in so einem Fall schaffen sie nur Ärger.
|
Re: Brauche Hilfe zu Threads
Hatte den zweiten Timer schon gelöscht. Muss ich erst wieder neu schreiben. Dauert ca 30 Minuten.
|
Re: Brauche Hilfe zu Threads
Bei Timer2 läuft zwar die Uhr, aber das Pendel zuckt höchstens.
Bitte über meinen Code nicht lachen, bin wirklich nur Anfänger!
Delphi-Quellcode:
unit Uhr1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, mmSystem, math, jpeg; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; Image3: TImage; Timer1: TTimer; Label1: TLabel; Label2: TLabel; Button1: TButton; Pendel: TTimer; Timer2: TTimer; procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Timer2Timer(Sender: TObject); private { Private-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Form1.Width := 210; Form1.Height := 452; Form1.Position := poScreenCenter; Doublebuffered := True; end; Procedure Berechne_Stunde(winkel: Real; var xi,yi: Integer); var x,y:Real; begin winkel := winkel - pi/2; x:= 134 + 31*Cos(winkel); y:= 150 + 31*Sin(winkel); xi:=Trunc(x); yi:=Trunc(y); end; Procedure Berechne_Minute(winkel:Real;var ri,si:Integer); var r,s:Real; begin winkel := winkel - pi/2; r:= 134 + 39*Cos(winkel); s:= 150 + 39*Sin(winkel); ri:=Trunc(r); si:=Trunc(s); If sin(winkel) = -1 then sndPlaySound(PChar('file10.wav'), SND_ASYNC); If sin(winkel) = 1 then sndPlaySound(PChar('file9.wav'), SND_ASYNC); end; Procedure Berechne_Sekunde(winkel:Real;var ui,vi:Integer); var u,v:Real; begin winkel := winkel - pi/2; u:= 134 + 50*Cos(winkel); v:= 150 + 50*Sin(winkel); // sndPlaySound(PChar('start.wav'), SND_ASYNC); ui:=Trunc(u); vi:=Trunc(v); end; procedure TForm1.Timer1Timer(Sender: TObject); var hour,min,sec,msec:Word; x,y,r,s,u,v:Integer; begin DecodeTime(Now,hour,min,sec,msec); Label1.Caption := TimeToStr(Now); Label2.caption := DateToStr(Now); Refresh; //Stundenzeiger if hour > 12 then hour:= hour - 12; Berechne_Stunde(2*pi/12*hour + 2*pi/720*min,x,y); Canvas.Pen.Width := 4; Canvas.Pen.Color := clBlack; Canvas.Moveto(134, 150); Canvas.LineTo(x,y); //Minutenzeiger Berechne_Minute((2*pi/60*min),r,s); // + (2*pi/3600*min) Canvas.Moveto(134, 150); Canvas.Pen.Width := 3; Canvas.Pen.Color := clBlack; Canvas.LineTo(r,s); //Sekundenzeiger Berechne_Sekunde(2*pi/60*sec,u,v); Canvas.Moveto(134, 150); Canvas.Pen.Width := 1; Canvas.Pen.Color := clRed; Canvas.LineTo(u,v); { ######## Das Folgende war nur ein vereinfachter Test #### //Pendel Canvas.Pen.Width := 6; Canvas.Pen.Color := clBlack; if sec mod 2 = 1 then begin Refresh; Image3.visible:=false; Canvas.Moveto(139, 215); Canvas.LineTo(157,348); Image2.visible:=true; end else begin Refresh; Image2.visible:=false; Canvas.Moveto(129, 215); Canvas.LineTo(112,348); Image3.visible:=true; end; } end; procedure TForm1.Button1Click(Sender: TObject); begin Close; end; procedure TForm1.Timer2Timer(Sender: TObject); var hour,min,sec,msec:Word; begin // ######## Das Folgende ist nur ein vereinfachter Test #### //Pendel Canvas.Pen.Width := 6; Canvas.Pen.Color := clBlack; if sec mod 2 = 1 then begin Refresh; Image3.visible:=false; Canvas.Moveto(139, 215); Canvas.LineTo(157,348); Image2.visible:=true; end else begin Refresh; Image2.visible:=false; Canvas.Moveto(129, 215); Canvas.LineTo(112,348); Image3.visible:=true; end; end; end. |
Re: Brauche Hilfe zu Threads
Was sollte das Pendel denn sonst machen? Du hast in deinem Code ja nur zwei Zustände.
|
Re: Brauche Hilfe zu Threads
Das Pendel soll ordentlich schwingen. Der Test funktioniert aber nicht einmal mit zwei Zuständen. Die eine Pendelscheibe verschwindet gänzlich, der Pendelstab (LineTo) ist auf einer Seite nur als Aufblitzen zu sehen. Offensichtlich ist das Programm durch meinen Code überfordert. Deshalb wollte ich die Uhr im Hauptthread und das Pendel im Nebenthread laufen lassen.
|
Re: Brauche Hilfe zu Threads
Hast du vergessen, etwas zu kopieren oder steht das auch bei dir so da, dass Sec in Timer2Timer nie gesetzt wird?
Und nein, dein Programm ist garantiert nicht überfordert. Du kannst ja mal probieren, das Fenster zu verschieben und dann zu schauen, ob flüssig neugezeichnet wird. |
Re: Brauche Hilfe zu Threads
"if sec mod 2 = 1 then"
führt - wenn ich die Uhr mit {} abschalte - dazu, dass das Pendel ordentlich zwischen den zwei Zuständen wechselt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 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 by Thomas Breitkreuz