Autor Beitrag
Barret
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 156
Erhaltene Danke: 1

Win XP
D7 Ent
BeitragVerfasst: Fr 04.06.04 09:24 
hi :wave:

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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 04.06.04 09:35 
Vielleicht hilft es, wenn du - wenn die Anzeige geändert werden soll - nicht nur was wieLabel1.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! :dance: :party: :dance2:

_________________
We are, we were and will not be.
Barret Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 156
Erhaltene Danke: 1

Win XP
D7 Ent
BeitragVerfasst: 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 :eyecrazy: ^^
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 156
Erhaltene Danke: 1

Win XP
D7 Ent
BeitragVerfasst: 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 :autsch: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 04.06.04 10:35 
zeig doch mal n bissel Quellcode. Meine Kristallkugel is mir nämlich grade hingefallen...:lol:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 156
Erhaltene Danke: 1

Win XP
D7 Ent
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TFKondensatorMain.Timer1Timer(Sender: TObject);
begin
  DatumanzeigeLabel.Caption := DateToStr((Now));  //Datum
  UhrzeitanzeigeLabel.Caption := TimeToStr((Now));  //Zeit

  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
ausblenden Delphi-Quelltext
1:
PBLadeStatus.Repaint;					

ausblenden Delphi-Quelltext
1:
PBLadeStatus.Update;					

und
ausblenden Delphi-Quelltext
1:
PBLadeStatus.Refresh;					

diese Möglichkeiten hab ich im Timer & in den Schleifen ausprobiert
natürlich immer einzelnt

Moderiert von user profile iconMotzi: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: 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 :autsch: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 156
Erhaltene Danke: 1

Win XP
D7 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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



BeitragVerfasst: Fr 04.06.04 12:02 
Ohne Timer nur mit Thread:

ausblenden volle Höhe Delphi-Quelltext
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
    { Private declarations }
  public
    { Public declarations }
    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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 04.06.04 12:19 
ohne Timer, ohne Thread:
ausblenden 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.