Verfasst am: 04.12.2007, 10:31
Titel: Tutorial: Verwendung von WAITBAR im eigenen Code.
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.
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 ifishandle(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
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
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
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
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.