A rudimentary timer (low granularity), that doesn't lock IGOR up.
andyfaff
//a background task that you can use to wait for a given timeperiod. This is probably called from
//another background task. This is useful if you don't want to lock IGOR up.
Function startwait(timeout)
variable timeout
variable/g root:endtime
NVAR endtime = root:endtime
endtime = datetime+timeout
CtrlNamedBackground waiter,period=60,proc=waittask
CtrlNamedBackground waiter, start
End
Function stopwait()
ctrlnamedbackground waiter,stop=1
killvariables root:endtime
ENd
Function waitStatus()
ctrlnamedbackground waiter,status
return numberbykey("RUN",S_info)
End
Function waittask(s)
STRUCT WMBackgroundStruct &s
NVAR endtime = root:endtime
if(datetime > endtime)
stopwait()
return 1
endif
return 0
End
//another background task. This is useful if you don't want to lock IGOR up.
Function startwait(timeout)
variable timeout
variable/g root:endtime
NVAR endtime = root:endtime
endtime = datetime+timeout
CtrlNamedBackground waiter,period=60,proc=waittask
CtrlNamedBackground waiter, start
End
Function stopwait()
ctrlnamedbackground waiter,stop=1
killvariables root:endtime
ENd
Function waitStatus()
ctrlnamedbackground waiter,status
return numberbykey("RUN",S_info)
End
Function waittask(s)
STRUCT WMBackgroundStruct &s
NVAR endtime = root:endtime
if(datetime > endtime)
stopwait()
return 1
endif
return 0
End
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More
//another background task. This is useful if you don't want to lock IGOR up. (original by andyfaff)
//Upgrades by Stefan Mangold, using multiple alarms, executing one task per timer
// startwaitAndExecuteTaskUnified, best option
Function startwaitAndExecuteTaskUnified(timeout,type,TaskName)
variable timeout, type
string TaskName
if(exists("root:numberOfWaiter")==0)
variable/g root:numberOfWaiter
NVar numberOfWaiterG = root:numberOfWaiter
numberOfWaiterG = 0
else
NVar numberOfWaiterG = root:numberOfWaiter
endif
if(numberOfWaiterG == 0)
make/D/O/N=(numberOfWaiterG+1) root:endtimeW
make/D/O/N=(numberOfWaiterG+1) root:typeW
make/T/O/N=(numberOfWaiterG+1) root:TaskNameW
else
redimension /N=(numberOfWaiterG+1) root:endtimeW
redimension /N=(numberOfWaiterG+1) root:typeW
redimension /N=(numberOfWaiterG+1) root:TaskNameW
endif
wave endtimeW = root:endtimeW
wave typeW = root:typeW
wave/T TaskNameW = root:TaskNameW
TaskNameW[numberOfWaiterG] = TaskName
typeW[numberOfWaiterG] = type
endtimeW[numberOfWaiterG] = datetime+timeout
numberOfWaiterG += 1
printf "Waiting task number %g\r" , numberOfWaiterG
//string WaitingTaskString = "waiterNum" + num2str(numberOfWaiterG)
string WaitingTaskString = "waiter"
if(numberOfWaiterG ==1)
CtrlNamedBackground $WaitingTaskString,period=60,proc=waittaskUnified
CtrlNamedBackground $WaitingTaskString, start
endif
End
Function stopwaitUnified(ii)
variable ii
NVar numberOfWaiterG = root:numberOfWaiter
wave endtimeW = root:endtimeW
wave typeW = root:typeW
wave/T TaskNameW = root:TaskNameW
printf "Removed waiting Task number %g, with endtime %s, type %g and task %s\r" , (ii+1), (Secs2Time((endtimeW[ii]),3)), typeW[ii], TaskNameW[ii]
//printf "%g. Alarm is on %s at %s\r", (ii+1),(Secs2Date((endtimeW[ii]),-1)), (Secs2Time((endtimeW[ii]),3))
//string WaitingTaskString = "waiterNum" + num2str(numberOfWaiterG)
string WaitingTaskString = "waiter"
if(numberOfWaiterG <= 1)
ctrlnamedbackground $WaitingTaskString,stop=1
//killvariables root:endtime
killwaves/Z endtimeW, typeW, TaskNameW
numberOfWaiterG -= 1
print "All Tasks done"
else
DeletePoints (ii), 1, endtimeW, typeW, TaskNameW
numberOfWaiterG -= 1
endif
End
//waitStatusPlusTimeLeft
Function waitStatusPlusTimeLeft()
ctrlnamedbackground waiter,status
if(numberbykey("RUN",S_info) != 0)
NVar numberOfWaiterG = root:numberOfWaiter
wave endtimeW = root:endtimeW
wave typeW = root:typeW
wave/T TaskNameW = root:TaskNameW
printf "%g waiting task running\r" , (numberOfWaiterG)
variable ii
for(ii = 0; ii < numberOfWaiterG; ii += 1)
variable Timeleft
Timeleft = endtimeW[ii] - datetime
printf "%g. Alarm is on %s at %s\r", (ii+1),(Secs2Date((endtimeW[ii]),-1)), (Secs2Time((endtimeW[ii]),3))
printf "time for Alarm %g left %s\r",(ii+1), (Secs2Time(Timeleft, 5 ))
endfor
else
print "No timer running"
endif
return numberbykey("RUN",S_info)
End
//unified wait task
Function waittaskUnified(s)
STRUCT WMBackgroundStruct &s
NVar numberOfWaiterG = root:numberOfWaiter
wave endtimeW = root:endtimeW
wave typeW = root:typeW
wave/T TaskNameW = root:TaskNameW
variable ii
for(ii = 0; ii < numberOfWaiterG; ii += 1)
string executeString
sprintf executeString, "%s" ,TaskNameW[ii]
if(datetime > endtimeW[ii])
if(typeW[ii] == 1)
ExecuteScriptText executeString
else
execute executeString
endif
stopwaitUnified(ii)
//DeletePoints (ii), 1, endtimeW, typeW, TaskNameW
//numberOfWaiterG -= 1
//stopwait()
//return 1
endif
endfor
//print s
return 0
End
May 30, 2010 at 05:13 am - Permalink