| Autor |
Beitrag |
Barret
      
Beiträge: 156
Erhaltene Danke: 1
Win XP
D7 Ent
|
Verfasst: Fr 04.06.04 09:24
hi
Ich hab ne ProgressBar die den Status von einer Berechnung anzeigt. Diese läuft immer im Hintergrund, wenn ich die Berechnung dann ausführe tritt die ProgessBar in den Vordergrund & zeigt halt den Status der Berechnung an.
Aber man kann den Status nur für eine Sekunde sehen, weil die Berechnung irgendwie zuviel Speicher frisst oder eine höhere Priorität als mein Timer bekommt. Die ProgressBar funtzt aber, hab ich schon ohne die Berechnung ausprobiert.
Kann man die Prioritäten von Proceduren so verändern, dass der Timer während der Berechnungszeit weiterläuft??
PS. die Zeitanzeige im Programm halt ebenso an wie die Statusanzeige
_________________ Wir könnten ja, wenn wir wollten aber wir wollen ja nicht.
It´s not a bug, it´s a feature.
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 04.06.04 09:35
Vielleicht hilft es, wenn du - wenn die Anzeige geändert werden soll - nicht nur was wie Label1.caption:='neuer Wert'; sondern auch ein label1.refresh; einfügst. Ich denke mal, dass der Timer läuft, aber dein Rechner is mit Rechnen beschäftigt, und will grade nicht malen. Deswegen heisst der ja Rechner und nicht Maler. Aber wenn man ihm sagt, er soll malen, dann tut er das auch...
Und da fällt mir noch was ein: Die "Berechnung" läuft ja bestimmt in einer Schleife oder so. Wenn du in diese Schleife ein Application.Processmessages; einbaust, dann sollte auch das TimerEvent Ereignis ausgelöst werden...
Und: 500! 
_________________ We are, we were and will not be.
|
|
Barret 
      
Beiträge: 156
Erhaltene Danke: 1
Win XP
D7 Ent
|
Verfasst: Fr 04.06.04 09:55
die 'refresh'-Anweisung hab ich mal in alle Berechnungsschleifen gepackt und da bekomme ich nur ein wildes zucken meiner Statusanzeige *geht voll auf die Augen wenn man sich das ne Zeit ansiht  ^^
und der Balken läd sich hirbei auch nicht auf
mit dem abbrechen des Timers fällt meines Erachtens auch flach, weil ich den ja für den Status brauch
ich hab ja noch repaint und update zum ausprobieren
_________________ Wir könnten ja, wenn wir wollten aber wir wollen ja nicht.
It´s not a bug, it´s a feature.
|
|
Barret 
      
Beiträge: 156
Erhaltene Danke: 1
Win XP
D7 Ent
|
Verfasst: Fr 04.06.04 10:18
soo ... jetzt bin ich total am ende
ich hab jetzt alle drei Möglichkeiten (update, repaint & refresh) in den Schleifen und im Timer eingesetzt und bin zu keinem brauchbarem Ergebnis gekommen
mit 'repaint' im Timer war es am besten (nicht so Augenkreps erregend ^^) aber er zählt die Anzeige trotzdem nicht hoch
wider nur eine Sekunde und dann bleibt er stehen und repaintet nur die Bar
verdammt jetzt hab ich kein Plan mehr  und bräuchte doch wider eure Hilfe!
_________________ Wir könnten ja, wenn wir wollten aber wir wollen ja nicht.
It´s not a bug, it´s a feature.
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 04.06.04 10:35
zeig doch mal n bissel Quellcode. Meine Kristallkugel is mir nämlich grade hingefallen...
Dann können wir uns besser vorstellen, was du machst, und wo das Problem liegen könnte.
_________________ We are, we were and will not be.
|
|
Barret 
      
Beiträge: 156
Erhaltene Danke: 1
Win XP
D7 Ent
|
Verfasst: Fr 04.06.04 10:48
OK! mein Kleber, um deine Kugel zu reparieren, is grade aus aber, wir leben ja in der Neuzeit mit Internet und so
das seht bei mir im Timer:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TFKondensatorMain.Timer1Timer(Sender: TObject); begin DatumanzeigeLabel.Caption := DateToStr((Now)); UhrzeitanzeigeLabel.Caption := TimeToStr((Now)); Timer1.Interval := 140; PBLadeStatus.Position:=(PBLadeStatus.Position + 1); if (PBLadeStatus.Position = 100) then begin PBLadeStatus.Position := 0; end; end; |
PBLadeStatus is eine ProgressBar und der Rest is eigentlich ersichtlich
die Bar soll immer hochzählen, ich ändere nur den Zustand (Viseble) von der Bar und ner zweiten mir der ich nichts mache, um den Status anzuzeigen
die Berechnungs mit Schleifen und so will ich jetzt eigentlich nicht darstellen weil die zu eingehend in die Materie ist (auser ihr wollt son bissel von Kondensatoren erfahren)
achso meine Warianten zum immerwährendem Durchlauf der Bar waren
Delphi-Quelltext
Delphi-Quelltext
und
Delphi-Quelltext
diese Möglichkeiten hab ich im Timer & in den Schleifen ausprobiert
natürlich immer einzelnt
Moderiert von Motzi: Code- durch Delphi-Tags ersetzt.
_________________ Wir könnten ja, wenn wir wollten aber wir wollen ja nicht.
It´s not a bug, it´s a feature.
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Fr 04.06.04 10:52
Hallo,
wie bereits Gausi geschrieben hat, würde ich in den Schleifen ein Application.Processmessages; einbauen.
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
MartinPb
      
Beiträge: 698
|
Verfasst: Fr 04.06.04 10:54
| Barret hat folgendes geschrieben: | soo ... jetzt bin ich total am ende
ich hab jetzt alle drei Möglichkeiten (update, repaint & refresh) in den Schleifen und im Timer eingesetzt und bin zu keinem brauchbarem Ergebnis gekommen
mit 'repaint' im Timer war es am besten (nicht so Augenkreps erregend ^^) aber er zählt die Anzeige trotzdem nicht hoch
wider nur eine Sekunde und dann bleibt er stehen und repaintet nur die Bar
verdammt jetzt hab ich kein Plan mehr und bräuchte doch wider eure Hilfe! |
Bitte etwas mehr Eigeninitiative. Die Tips von Gausi sind alle Möglichkeiten die du hast. Versuch mit denen auszukommen und bau sie vernünftig ein. "Refresh" zwingt ein Element sich neu zu zeichnen. "Application.Processmessages" läßt neue Nachrichten durch. Somit werden auch alle nötigen Refresh'es ausgeführt. Was willst du also mehr? Wenn es nicht klappt, dann hast du die beiden Möglichkeiten nicht korrekt eingebaut. Und ohne Quelltext kann man nicht sagen wie.
Und nicht sofort aufgeben.
_________________ Gruß
Martin
|
|
Barret 
      
Beiträge: 156
Erhaltene Danke: 1
Win XP
D7 Ent
|
Verfasst: Fr 04.06.04 10:57
kannst du mir das vieleicht genauer erklären & am besten wär die ganze Sache noch wenn du mir noch ein kleines Beispiel dazuschreiben würdest
bin leider noch auf dem Noob-Level
_________________ Wir könnten ja, wenn wir wollten aber wir wollen ja nicht.
It´s not a bug, it´s a feature.
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 04.06.04 11:06
zu dem Application.processmessages nochmal was:
Wenn deine Berechnung läuft, dann läuft deine Berechnungen. Wenn du während dieser Berechnung irgendeinen Button drückst oder so, passiert auch nix, weil dein Programm (Application) mit der Berechnung beschäftigt ist, und die Nachricht (Message) "Button geklickt" oder "Timer is Abgelaufen" nicht verarbeiten (process) kann.
Wenn du also in deiner Berechnung ab und zu mal ein "Nachrichten an das Programm verarbeiten" (Application.ProcessMessages) reinpackst, sollte es klappen...
Also in etwa:
Delphi-Quelltext 1: 2: 3: 4: 5:
| for i:=0 to ganzdollviel do begin Rechne_wie_wild_rum; Application.processmassages; end; |
Dann wird einmal gerechnet, dann wird gekuckt, ob was "passiert" ist, und dann wird weitergerechnet...
_________________ We are, we were and will not be.
|
|
MartinPb
      
Beiträge: 698
|
Verfasst: Fr 04.06.04 11:17
Ich hab jetzt deine Timer Prozedur gesehen und muß dir sagen, daß du eigentlich keine Refresh Funktionen benötigst. Wenn die Timerprozedur aufgerufen wird, dann werden auf jeden Fall auch Nachrichten empfangen. Wenn du also ein Refresh oder Application.Prozessmessages anwenden willst, dann weniger in der Timer Prozedur, als in der Prozedur in der du die Berechnung machst. Da mußt du Application.Prozessmessages ausführen.
_________________ Gruß
Martin
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 04.06.04 11:30
Ich glaube aber, dass die Timerprozedur gar nicht aufgerufen wird (Grund is klar, oder?).
Das Application.processmessages muss in die Schleife rein. Wenn das da drin ist, kann trotz laufender Berechnung die Timerprozedur ausgelöst werden und die Position der Progressbar geändert werden. Es kann sein, dass dann kein Refresh nötig ist. ich hatte mal ein ähnliches Problem mit ner Statusbar, da wär ein zusätzliches Refresh nötig. Dies würde ich aber in die Timerprozedur reinsetzen, weil es nur dann nötig ist.
btw:Timer1.Interval := 140; kann man sich eigentlich sparen.
_________________ We are, we were and will not be.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 04.06.04 12:02
Ohne Timer nur mit Thread:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64:
| type TForm1 = class(TForm) Button1: TButton; ProgressBar1: TProgressBar; procedure Button1Click(Sender: TObject); private public procedure WndProc(var Message: TMessage); override; end;
var Form1: TForm1;
implementation
{$R *.dfm}
type TMyThreadParams = record FHandle: THandle; end; PMyThreadParams = ^TMyThreadParams;
const MY_THREADMESSAGE = WM_USER + 1974;
function MyThread(p: Pointer): Integer; var i: Integer; Handle: THandle; begin Handle := PMyThreadParams(p)^.FHandle; for i := 0 to 99 do begin Sleep(125); SendMessage(Handle, MY_THREADMESSAGE, 0, i); end; SendMessage(Handle, MY_THREADMESSAGE, 0, 0); FreeMem(p, sizeof(TMyThreadParams)); Result := 0; end;
procedure TForm1.WndProc(var Message: TMessage); begin inherited; case Message.Msg of MY_THREADMESSAGE: begin Progressbar1.Position := Message.LParam; end; end; end;
procedure TForm1.Button1Click(Sender: TObject); var ThreadID: Cardinal; ThreadParams: PMyThreadParams; begin GetMem(ThreadParams, sizeof(TMyThreadParams)); ThreadParams.FHandle := Handle; CloseHandle(BeginThread(nil, 0, @MyThread, ThreadParams, 0, ThreadID)); end; |
Gebraucht werden eine Progressbar (Step=10) und ein Button.
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 04.06.04 12:19
ohne Timer, ohne Thread:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Progressbar1.max:=SchleifenMax; Progressbar1.position:=0; for i:=0 to SchleifenMax do begin rechne_was; progressbar1.position:=progressbar1.Postition+1; progressbar1.refresh; end; |
Ist aber nicht empfehlenswert, wenn SchleifenMax zu groß ist. Aber da ich nicht weiss, wie die Berechnung aussieht...
_________________ We are, we were and will not be.
|
|
|