Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi "Sleep"-t das programm wenn man... (https://www.delphipraxis.net/137311-sleep-t-das-programm-wenn-man.html)

DArc 18. Jul 2009 13:50


"Sleep"-t das programm wenn man...
 
meine frage ist, ob das programm freezed, schläft oder was auch immer, wenn man
.res dateien extrahiert?

denn ich habe ein programm gemacht, dass die res datei zb als exe extrahiert
und habe auch ein ladebalken / progressbar gemacht. das problem ist, dass
die progressbar nicht lädt, sondern nur am ende angezeigt wird, da offensichtlich
das programm solange schläft ...

meine frage ist, ob es wirklich "sleep"-t

Delphi-Quellcode:
if (Antwort = 'Ja') then
begin
Label1.Caption := 'Need Help!';
Label2.Caption := 'Nächste Frage wäre dann:';
Label2.Caption := 'Könntet ihr mir helfen?';
end;
(spaß bei seite^^)

himitsu 18. Jul 2009 13:59

Re: "Sleep"-t das programm wenn man...
 
Wenn du dem Programm (z.B. durch Application.ProgressMessages) nicht die Möglichkeit gibst sich zu aktualisieren, kann sich an der Oberfläche auch nichts tun.

Aber was machst du nochmal?
Du holst eine EXE aus den Ressourcen oder wie?
Aber das kann doch nicht sooo lange dauern, das man dafür 'nen Ladebalken braucht :gruebel:

Phoenix 18. Jul 2009 14:01

Re: "Sleep"-t das programm wenn man...
 
Nein, das Programm schläft nicht, sondern arbeitet hart. Nämlich an dem extrahieren der Ressourcen.
Das Programm ist dabei so beschäftigt, dass es die Windows-Messages zum zeichnen der Oberfläche nicht abarbeiten kann.
Also öfter mal ein ProcessMessages rein, und *wuppdi* klappts auch mit dem Zeichnen des Fortschrittbalkens.

Roter Kasten: Da war jemand schneller :mrgreen:

DArc 18. Jul 2009 14:03

Re: "Sleep"-t das programm wenn man...
 
Zitat:

Zitat von himitsu
Wenn du dem Programm (z.B. durch Application.ProgressMessages) nicht die Möglichkeit gibst sich zu aktualisieren, kann sich an der Oberfläche auch nichts tun.

Aber was machst du nochmal?
du holst eine EXE aus den Ressourcen?
aber das kann doch nicht sooo lange dauern, daß man dafür 'nen Ladebalken braucht :gruebel:

ich wusste zuerst eben net, dass es wirklich so schnell geht, aber für größere dateien lohnt sich das natürlich schon ...
(die exe ist ungefähr 100mb - das ist eig. noch ziemlich klein in meinem projekt)

und ja, ich habe Application.ProcessMessage eingebaut ...

ich gebe euch mal den quellcode^^


Delphi-Quellcode:
if (Gewicht = Gewicht div 100 * 100) then
begin
Application.ProcessMessages;
sProgressBar1.Position := 100;
sButton1.Visible := False;
sButton2.Visible := True;
sButton3.Visible := False;
end;

usw. ...

edit: ich versuchs mal mit 1gb^^
bis gleich^^

Satty67 18. Jul 2009 14:10

Re: "Sleep"-t das programm wenn man...
 
Dein Quellcode sieht seltsam aus... erst Nachrichten abarbeiten, dann Komponenten aktualisieren ist falsch herum... und wieso gleich auf 100... eine Schrittweite ist nicht erkennbar.

Die Progressbar ist aber auch meines Wissens nicht von Application.ProgressMessages abhängig (sollte also immer, auch unter Last die Anzeige aktualisieren)

DArc 18. Jul 2009 14:15

Re: "Sleep"-t das programm wenn man...
 
Zitat:

Zitat von Satty67
Dein Quellcode sieht seltsam aus... erst Nachrichten abarbeiten, dann Komponenten aktualisieren ist falsch herum... und wieso gleich auf 100... eine Schrittweite ist nicht erkennbar.

Die Progressbar ist aber auch meines Wissens nicht von Application.ProgressMessages abhängig (sollte also immer, auch unter Last die Anzeige aktualisieren)


das gehört auch zu den letzten zeilen^^

klar ist es "gleich" auf 100
ist ja auch die letzte aktualisierung...

für 1:

Delphi-Quellcode:
if (Gewicht = Gewicht div 100 * 1)then
begin
Application.ProcessMessages;
sProgressBar1.Position := 1;
end;
oder muss ich das umdrehen:


Delphi-Quellcode:
if (Gewicht = Gewicht div 100 * 1)then
begin
sProgressBar1.Position := 1;
Application.ProcessMessages;
end;
???

Phoenix 18. Jul 2009 14:24

Re: "Sleep"-t das programm wenn man...
 
Häh? Für einen Fortschrittsbalken reicht es nicht, den anfangs auf 0/1 und am Ende auf 100 zu setzen.
Du musst ihn in jedem Schritt auf den entsprechenden Wert setzen und nach dem Wert setzt auch neu Zeichnen lassen.

Also im Stil von:
Fortschittsbalken = atuellerWert/maximalWert *100;
Neuzeichnen;

DArc 18. Jul 2009 14:28

Re: "Sleep"-t das programm wenn man...
 
Zitat:

Zitat von Phoenix
Häh? Für einen Fortschrittsbalken reicht es nicht, den anfangs auf 0/1 und am Ende auf 100 zu setzen.
Du musst ihn in jedem Schritt auf den entsprechenden Wert setzen und nach dem Wert setzt auch neu Zeichnen lassen.

Also im Stil von:
Fortschittsbalken = atuellerWert/maximalWert *100;
Neuzeichnen;


hab ich doch, dass ist nicht der ganze quellcode -_-

himitsu 18. Jul 2009 14:31

Re: "Sleep"-t das programm wenn man...
 
ok, bei 100 MB / 1 GB könnte es schon dauern (ist ja recht selten, daß eine EXE mal so groß ist)


Zitat:

hab ich doch, dass ist nicht der ganze quellcode -_-
das können wir doch nicht wissen, also gehen wir nur davon auß, daß des Alles ist,
denn sonst hättest du ja mehr gepostet :zwinker:

Delphi-Quellcode:
if (Gewicht = Gewicht div 100 * 100) then
=
Delphi-Quellcode:
if Gewicht mod 100 = 0 then

DArc 18. Jul 2009 14:35

Re: "Sleep"-t das programm wenn man...
 
Zitat:

Zitat von himitsu
ok, bei 100 MB / 1 GB könnte es schon dauern (ist ja recht selten, daß eine EXE mal so groß ist)


Zitat:

hab ich doch, dass ist nicht der ganze quellcode -_-
das können wir doch nicht wissen, also gehen wir nur davon auß, daß des Alles ist,
denn sonst hättest du ja mehr gepostet :zwinker:

Delphi-Quellcode:
if (Gewicht = Gewicht div 100 * 100) then
=
Delphi-Quellcode:
if Gewicht mod 100 = 0 then


ich meints auch nicht böse^^

habe eine rar und eine exe datei ... die sind ungefähr 600 mb groß, und noch weitere 4 dateien, sprich 6 * 600mb^^
dann braucht man schon einen ladebalken^^


thx für alle tipps und für das vebresserte if :thumb:


habe es gerade nochmal versucht^^

iwie schuftet er "nur" und zeigt die progressbar net an^^
ich versuchs gleich mit 1gb^^

turboPASCAL 18. Jul 2009 17:16

Re: "Sleep"-t das programm wenn man...
 
Du könntest ja ach mal zeigen wie deine Entpackgeschichte ausschaut.
Möglicher weise hat dein Ladebalken ein "was soll ich machen" Problem.

DArc 18. Jul 2009 18:10

Re: "Sleep"-t das programm wenn man...
 
nene passt schon^^

extrahiere ganz normal die res als ursprüngliches format ...

bei dem ladebalken habe ich mir was schönes ausgedacht ...

erst wird überprüft ob die datei existiert, wenn ja, so zähle man

die NUN messbare größe ... timer interval auf 1 ...

der balken richtet sich nach der größe ...

sprich 1/100 sind 1% des balkens usw.^^

Medium 19. Jul 2009 00:59

Re: "Sleep"-t das programm wenn man...
 
Zitat:

Zitat von DArc
Delphi-Quellcode:
if (Gewicht = Gewicht div 100 * 100) then
begin
sProgressBar1.Position := 100;
sButton1.Visible := False;
sButton2.Visible := True;
sButton3.Visible := False;
end;

*schüttel*

Delphi-Quellcode:
sProgressBar1.Position := Round((Gewicht/MaxGewicht)*100);
Einfachste Prozentrechnung. Sollte man auch mit 15 schonmal gesehen haben ;)

Edit: Application.ProcessMessages(); ist meist auch ein Indiz dafür, dass man hier mit einem Thread wohl besser bedient wäre. ProcessMessages ist bei solchen Vorgängen eher ne Quick'n'Dirty-Krücke als denn eine angemessene Lösung. Geht, ist aber nicht wirklich elegant, und je nach dem in welchen Intervallen man es aufruft führt es dennoch zu Stocken bei der Anzeige/Bedienung.

Luckie 19. Jul 2009 03:08

Re: "Sleep"-t das programm wenn man...
 
Zitat:

Zitat von DArc
extrahiere ganz normal die res als ursprüngliches format ...

Was heißt "ganz normal"? Wenn du einen Stream benutzt, dann klappt das mit dem Fortschrittsbalken natürlich nicht, da du keine Schleife hast, wie viel der Stream schon geschrieben hat. Du solltest uns endlich mal den Code zeigen, der die Ressource extrahiert.

Solltest du einen Steam benutzen, dann guck dir mal meine Klasse TStreamProgressAdapter an: http://www.michael-puff.de/Developer/Delphi/Demos

DArc 19. Jul 2009 10:44

Re: "Sleep"-t das programm wenn man...
 
thx @ Medium^^

hier ...

habe ich hier aus dem forum gestänzt^^

Delphi-Quellcode:
procedure TForm3.sButton3Click(Sender: TObject);
var
tr : TResourcestream; // Einen Ressource Stream angeben!
begin
if Form1.sRadioButton1.Checked then
 begin
  if not FileExists('C:\Programme\xyz\xyz.xyz') then
  begin
   tr := TResourcestream.Create(hinstance,'xyz','xyz'); //wird erstellt
   Form3.JvTimer1.Enabled := True;
   forcedirectories('C:\Programme\xyz\');
   tr.SaveToFile('C:\Programme\xyz\xyz.xyz');
  end
  else
  ShowMessage('Die Datei existiert bereits!'); //wird extrahiert und gespeichert
  tr.Free; //Stream wird freigegeben
end;
sieht bissle durcheinander und "angfängerhaft" aus, saß aber kaum dran ... zock lieber -_-



hoffe ihr könnt damit was anfangen^^

DArc 22. Jul 2009 07:04

Re: "Sleep"-t das programm wenn man...
 
keine antwort?

oder sollte das eigentlich funzen?

Namenloser 22. Jul 2009 07:22

Re: "Sleep"-t das programm wenn man...
 
Wo liegt dein Problem? Und wenn du selber schon sagst, dass dein Code unordnetlich ist, solltest du vielleicht liebr aufräumen.

DArc 23. Jul 2009 18:58

Re: "Sleep"-t das programm wenn man...
 
oha ... schreibste immer so oder ... ??

naja egal

1. das problem: die progressbar macht nix
2. keine zeit?!
3. wieso liest du net die anderen beiträge?

Aphton 23. Jul 2009 19:29

Re: "Sleep"-t das programm wenn man...
 
Also bei dir freezed nichts und es arbeitet auch nichts auf hochtrieben:

Folgende Gleichung (mathematisch gesehen jetzt) wird nie erfüllt sein:
n = n / x * y

(delphi):
if (Gewicht = Gewicht div 100 * 1) then

Dh dein Progressbar wird sich nur einmal - und zwar genau dann, wenn x und y identisch sind - aktualisieren ;)

( .. div 100 * 100 )

MfG

Namenloser 23. Jul 2009 19:56

Re: "Sleep"-t das programm wenn man...
 
Zitat:

Zitat von DArc
1. das problem: die progressbar macht nix

Natürlich macht die nix, in deinem Code (zumindest in dem Teil, den du uns gezeigt hast) kommt sie ja auch kein einziges mal vor.
Zitat:

Zitat von DArc
3. wieso liest du net die anderen beiträge?

Ich habe die anderen Beiträge natürlich gelesen und mir ist dabei aufgefallen, dass dir schon mehrfach erklärt wurde, wie du den Fortschritt ausrechnest und darstellst. Ich frage mich eher, ob du die Beiträge liest.

Und wenn du lieber zockst, anstatt zu programmieren, dann tu das eben, aber erwarte nicht, dass jemand anderes dir deinen Code schreibst, nur weil du zu faul bist.

DArc 24. Jul 2009 15:44

Re: "Sleep"-t das programm wenn man...
 
[quote="NamenLozer"]
Zitat:

Zitat von DArc
1. das problem: die progressbar macht nix[/delphi]
Natürlich macht die nix, in deinem Code (zumindest in dem Teil, den du uns gezeigt hast) kommt sie ja auch kein einziges mal vor.
Zitat:

Zitat von DArc
3. wieso liest du net die anderen beiträge?

Ich habe die anderen Beiträge natürlich gelesen und mir ist dabei aufgefallen, dass dir schon mehrfach erklärt wurde, wie du den Fortschritt ausrechnest und darstellst. Ich frage mich eher, ob du die Beiträge liest.

Und wenn du lieber zockst, anstatt zu programmieren, dann tu das eben, aber erwarte nicht, dass jemand anderes dir deinen Code schreibst, nur weil du zu faul bist.

vllt habe ich die anderen sachen net verstanden?

genau du sagst, dass es mir erklärt wurde, aber wenn ich es nicht verstehe, dann kann ich es auch nicht
richtig machen und ich zocke gerade deshalb viel, weil ich bald 4wochen in ungarn bin und kein inet habe
und weil ich seit knapp 3 wochen wieder angefangen habe!

okay, ich editier einfach mein beitrag hier wenn ich noch ne frage habe, versuche es, wie es die anderen
mir geschrieben haben und hoffe auf tolle funktionsfähigkeit^^

(was schreibe ich da eig. ?? xD)

naja, thx an die, die mir geholfen haben, mir helfen wollten oder sonst was ... schönes wochenende!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz