WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Tutorial: Verwendung von WAITBAR im eigenen Code.

 

outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 04.12.2007, 11:31     Titel: Tutorial: Verwendung von WAITBAR im eigenen Code.
  Antworten mit Zitat      
Dieser Tutorial beschäftigt sich mit dem Einsatz von Wartebalken im eigenen Code. Alle Beispiele können durch copy/paste unter MATLAB sofort getestet werden.

Ich werde 3 Einsatzmöglichkeiten beschreiben
1. Der Einsatz mit der Standard WAITBAR Funktion.
2. Integration des Wartebalkens in die eigene GUI.
3. Statusanzeige für Command Window.

Extra
Wie programmiere ich eine Restzeitanzeige für die FOR-Schleife?




1. Die Standard WAITBAR
Benötigt eine einzige Schleife nur sehr wenig Zeit oder der Zähler zählt mehrere Tausend schleifen, wäre dies eine Ressourcenverschwendung die WAITBAR in jedem Schritt zu aktualisieren. Im ersten Falle leidet enorm die Gesamtperformance und im zweiten Falle sieht man die Änderung sowieso nicht... Es riecht schon nach einer Optimierung. Smile

Code:
% WAITBAR Initialisierung
h = waitbar(0,'','Name','Please wait...');
%
for i=1:5000
   %
   % Ob die WAITBAR nun aktualisiert werden soll oder nicht testen wie
   % in der nächsten Zeile. Somit wird die WAITBAR innerhalb einer
   % FOR-Schleife mit 5000 Zyklen nur 5000/50 = 100 mal aufgerufen.
   if ~mod(i,50)
      %
      % Es kann passieren, das der Benutzer die WAITBAR mit der Mouse-Click
      % auf den X-Button abschiesst. Um sicher zu sein, dass die WAITBAR
      % noch da ist, testen wir, on der die noch aktiv ist
      if ishandle(h)
         %
         % die eigentliche WAITBAR Aktualisierung.
         % Nebenbei wird auch der erreichter Stand in "%" dargestellt.
         waitbar(i/5000,h,[num2str((i*100)/5000) '%'])
      else
         %
         disp('process wurde unterbrochen')
         break
      end
   end
   %
   %%% Hier kommt Dein Code %%%
   pause(0.01)
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%
   %
end
% Waitbar schliessen. Falls jedoch die Waitbar mit dem Mausklick bereits
% geschlossen wurde, dann kann der CLOSE-Befehl nicht fehlerfrei
% durchgeführt werden, da der Handle "h" nicht mehr exisitiert, daher
% sollte der Fehler unterdrückt werden.
try
   close(h)
end% if



2. Wir wärs mit einem Wartebalken innerhalb eigener GUI?!
Dadurch kannst Du Deiner GUI eine bessere Optik verleihen.

Code:
figure
uicontrol('style','text', ...
          'units','pixel', ...
          'position',[19 19 122 14], ...
          'backgroundcolor',[.95 .95 .95]);
h = uicontrol('style','text', ...
              'units','pixel', ...
              'position',[20 20 120 12], ...
              'backgroundcolor',[.4 .4 .4], ...
              'foregroundcolor',[.95 .95 .95]);
%
for i=1:80
   pos = get(h,'position');
   % der Balken ist maximal 120 pixel lang
   pos(3) = i/80*120;
   set(h,'position',pos,'string',sprintf('%.0f%%',i/80*100))
   drawnow
   %
   %%% Hier kommt Dein Code %%%
   pause(0.05)
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%
   %
end


3. Statusanzeige im MATLAB Command Window.
Manchmal möchte man auf die grafischen Oberflächen ganz verzichten.

Code:
for i=1:100
   tmp = sprintf('Please wait... %.0f%%. (type ctrl-C to stop)\n', i );
   fprintf('%s',tmp)
   %
   %%% Hier kommt Dein Code %%%
   pause(0.05)
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%
   %
   fprintf('%s',char(sign(tmp)*8))  
end


oder auch etwas anders aussehend:
Code:
for i=1:200
   n = fix(i/200*10);
   tmp = sprintf('[%s%s]\n',char('#'*ones(1,n)),char(' '*ones(1,10-n)));
   fprintf('%s',tmp)
   %
   %%% Hier kommt Dein Code %%%
   pause(0.05)
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%
   %
   fprintf('%s',char(sign(tmp)*8))  
end


Natürtlich lassen sich alle Beispiel mit den Hinweisen aus dem Teil.1 Kombinieren.


Extra: Restzeitanzeige
Gerade bei sehr langen Berechnungszeiten wünscht man sich die Restzeitanzeige. Dazu muss zuerst die Zeit vor der Ausführung mit dem Befehl TIC gestoppt werden. Anschliessend wird in jedem Aktualisierungschritt die verstrichene Zeit mit TOC gemessen und ausgehend von dem erreichtem Stand die restliche Zeit voraus berechnet.

tic
for i=1:N
Required_Time = toc*(N-i)/i;
end

Nun ein funktionierendes Beispiel:
Code:
tic
for i=1 : 250
   tmp = sprintf('Please wait... %.0f%%. [time required %ds]\n', i/250*100 , fix(toc*(250-i)/i));
   fprintf('%s',tmp)
   %
   %%% Hier kommt Dein Code %%%
   pause(0.15)
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%
   %
   fprintf('%s',char(sign(tmp)*8))  
end


Wichtig!
Die Restzeitanzeige ist genau nur für FOR-Schleifen, deren jeweilige Schleifen etwa die gleiche Zeit verbrauchen.



(c) 2007 by outsider [MCommander(at)gmx.de]
P.S. Du hast einen Fehler entdeckt oder hast ein Verbesserungsvorschlag? Her damit per PN...
Private Nachricht senden Benutzer-Profile anzeigen


lism
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 06.04.11
Wohnort: Bad Homburg
Version: ---
     Beitrag Verfasst am: 10.04.2011, 09:52     Titel:
  Antworten mit Zitat      
Vielen-vielen Dank!Smile tutorium war sehr hilfreich!
Private Nachricht senden Benutzer-Profile anzeigen
 
ms1080
Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 02.12.09
Wohnort: ---
Version: R2009
     Beitrag Verfasst am: 04.09.2012, 11:48     Titel:
  Antworten mit Zitat      
Sehr schön und anschaulich erklärt, Danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.