PRO WSTBUSY, ANNOUNCEMENT ;+ ; NAME: ; WSTBUSY ; ; PURPOSE: ; This function can be embedded inside an IDL code that is expected to ; run for a long time, announcing with printed messages that the code is ; still running. Unlike a PRINT statement in a loop, WSTBUSY makes its ; announcements just once a minute. ; ; CATEGORY: ; Calming down impatient users like the author. ; ; CALLING SEQUENCE: ; WSTBUSY[, ANNOUNCEMENT] ; ; OPTIONAL INPUT: ; ANNOUNCEMENT: An array of messages or values to be printed. If no ; parameter is used, the message reads "STILL BUSY" plus the time and ; date. ; ; ; OUTPUT: ; NONE. ; ; COMMON BLOCKS: ; BIZZY ; ; SIDE EFFECTS: ; The overhead of calling this function many times might be onerous; so ; don't bury it deep inside nested loops. ; ; PROCEDURE: ; Each time the procedure is invoked, it decodes the !STIME system vari- ; able to see if the minute has changed since the last time. If so, then ; the program prints the announcement. If not, it returns and does ; nothing. ; ; EXAMPLE: ; The following code might be used in a coded procedure that runs for ; twenty minutes. About twenty times out of the 1000 passages through the ; loop, a message appears on the screen. ; ; for iter = 1, 1000 do begin ; number_cruncher, data, i ; WSTBUSY, "Processing iteration number " + strtrim(i,2) ; endfor ; ; MODIFICATION HISTORY: ; Written by: James Hamill ; Siemens Medical Systems ; 2501 N. Barrington Rd. ; Hoffman Estates, IL 60195-7372 ; (708)304-7760 ; hamill@sgi.siemens.com ; October, 1989 ; ;- common bizzy, last_minute now = !stime colon_position = strpos(now,":") minute = strmid(now,colon_position+1,2) ;------------------------------------------------------------------------------- ; What minute was it the last time we checked? But maybe there was no "last ; time." Return if we printed a message less than 1 minute ago. ;------------------------------------------------------------------------------- sizl = size(last_minute) if sizl(1) eq 0 then last_minute = "xx" ; on the 1st call it's undefined if minute eq last_minute then RETURN ;------------------------------------------------------------------------------- ; Print one or more messages. The first line contains the words "STILL BUSY". ;------------------------------------------------------------------------------- if n_params() eq 0 then $ PRINT, "STILL BUSY. "+!stime $ else begin n_announcements = n_elements(ANNOUNCEMENT) PRINT, "STILL BUSY. " + string(ANNOUNCEMENT(0)) if n_announcements gt 1 then for i=1,n_announcements-1 do $ PRINT, string(ANNOUNCEMENT(i)) endelse ;------------------------------------------------------------------------------- ; Get ready for the next call: put this minute value in common. ;------------------------------------------------------------------------------- last_minute = minute return end