![]() |
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. |
Re: Brauche Hilfe zu Threads
Wann weist du denn Sec zu? Das steht nämlich nicht in dem, was du gepostet hast.
|
Re: Brauche Hilfe zu Threads
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 |
Re: Brauche Hilfe zu Threads
Hallo,
vielleicht solltest Du noch dies
Delphi-Quellcode:
in Deiner Timer Routine aufrufen.
DecodeTime(Now,hour,min,sec,msec);
Denn sec wird nie ein Wert zugewiesen (wie Phillip schon richtig angemerkt hat), er wird nur abgefragt. Grüße Klaus |
Re: Brauche Hilfe zu Threads
Hatte ich schon mal drin. Wieder eingefügt, kein Ergebnis.
Pendelscheiben-BMP durch Canvas.Ellipse(x1,y1,x2,y2); ersetzt, kein Ergebnis. Nur Pendelstab als LineTo, kein Ergebnis. Es bleibt dabei: Uhrzeiger und Pendel "beissen sich". Bin ziemlich verzweifelt, aber das gehört wohl dazu! |
Re: Brauche Hilfe zu Threads
Timer2 sieht jetzt so aus:
Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject);
var Now,hour,min,sec,msec: Word; begin // ######## Das Folgende ist nur ein vereinfachter Test mit 2 Zuständen#### //Pendel DecodeTime(Now,hour,min,sec,msec); Canvas.Pen.Width := 6; Canvas.Pen.Color := clBlack; if sec mod 2 = 1 then begin Canvas.Moveto(139, 215); Canvas.LineTo(157,348); Canvas.Ellipse(132,348,182,398); end else begin Canvas.Moveto(129, 215); Canvas.LineTo(112,348); Canvas.Ellipse(87,348,137,398); end; end; |
Re: Brauche Hilfe zu Threads
Delphi-Quellcode:
now ist eine Funktion in Delphi, ich weiß nicht was passiert wenn
procedure TForm1.Timer2Timer(Sender: TObject);
var Now,hour,min,sec,msec: Word; begin // ######## Das Folgende ist nur ein vereinfachter Test mit 2 Zuständen#### //Pendel DecodeTime(Now,hour,min,sec,msec); Du den gleichen Namen nochmals als Variable benutzt. Vielleicht ist es besser so:
Delphi-Quellcode:
Grüße
procedure TForm1.Timer2Timer(Sender: TObject);
var hour,min,sec,msec: Word; begin // ######## Das Folgende ist nur ein vereinfachter Test mit 2 Zuständen#### //Pendel DecodeTime(Now,hour,min,sec,msec); Klaus |
Re: Brauche Hilfe zu Threads
Ich habe es auch mal ohne Now versucht, denn in der Hilfe steht nur DecodeTime(hour, min, sec, msec),
aber dann kann wegen "[Fehler] Uhr1.pas(124): Nicht genügend wirkliche Parameter" nicht kompiliert werden. Merkwürdig, aber mit "now" wird kompiliert. Zwischendurch möchte ich mich für Eure Geduld bedanken! |
Re: Brauche Hilfe zu Threads
Nun, decodeTime benötige auch fünf Parameter,
das habe ich auch nicht kritisiert. Du kannst now weiterhin in DecodeTime verwenden, aber schmeiß es doch einmal aus der Variablendeklaration raus. So wie ich es vorherigen Beitrag geschrieben habe. Grüße Klaus |
Re: Brauche Hilfe zu Threads
Habe ich gemacht, ändert aber nichts am Problem.
|
Re: Brauche Hilfe zu Threads
Das folgende pendelt bei mir aber richtig gut.
Grüße Klaus
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var hour,min,sec,msec: Word; begin // ######## Das Folgende ist nur ein vereinfachter Test mit 2 Zuständen#### //Pendel DecodeTime(Now,hour,min,sec,msec); Canvas.Pen.Width := 6; Canvas.Pen.Color := clBlack; if sec mod 2 = 1 then begin Canvas.Moveto(139, 215); Canvas.LineTo(157,348); Canvas.Ellipse(132,348,182,398); Canvas.Pen.Color:= clWhite; Canvas.Moveto(129, 215); Canvas.LineTo(112,348); Canvas.Ellipse(87,348,137,398); end else begin Canvas.Moveto(129, 215); Canvas.LineTo(112,348); Canvas.Ellipse(87,348,137,398); Canvas.Pen.Color:= clWhite; Canvas.Moveto(139, 215); Canvas.LineTo(157,348); Canvas.Ellipse(132,348,182,398); end; end; |
Re: Brauche Hilfe zu Threads
Hallo Klaus01!
Vielen Dank für Deine Mühe! Ich probier es noch aus, muss aber erst mal den Haussegen retten. Hat es auch zusammen mit einer Uhr geklappt? Ich melde mich wieder. Danke! Jürgen |
Re: Brauche Hilfe zu Threads
Hallo Klaus01! :mrgreen:
Hurra! Nachdem ich den Inhalt Deines Timers nicht als zweiten Timer, sondern in meinen Timer1 (hinter 'Sekundenzeiger') eingefügt habe, laufen endlich Uhr und - stark vereinfachtes - Pendel gleichzeitig. Nun muss ich nur noch herausfinden, wo mein eigentlicher Fehler lag, und dann wird die Uhr noch aufgemotzt! Ganz herzlichen Dank an Dich und falls er noch einmal hier hereinschaut, auch an den 15-jährigen Apollonius. So ein Forum ist eine feine Sache. Jürgen |
Re: Brauche Hilfe zu Threads
Ursächlichen Fehler gefunden: Auswirkungen eines weiteren unbeachteten "Refresh" unterschätzt.
Den Fehler mache ich nicht noch mal, aber es gibt ja noch soooo viel andere! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:23 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