InvokeLater function to run script after all pending events

I have Numeric Label “TempSP” with its value bound to:

lookup({Root Container.R1P1.Chart.TempSP}, {Root Container.R1P1.Calc_CurrentStep}, 0, 'StepNumber', 'Temperature')

I also have Numberic Label “CurrentStep” with its value bound to:

{Root Container.R1P1.Calc_CurrentStep}

In the Property Change Event for “CurrentStep” I have the following action script:

if event.propertyName == "value": #Log SerialNumber, StepNumber, TempSP, TempACT to BarrelRecipeHistory SerialNumber = event.source.parent.getComponent('SerialNumber').text StepNumber = event.source.value TempSetpoint = event.source.parent.getComponent('TempSP').value #TempActual = event.source.parent.getComponent('TempACT').value TempActual = TempSetpoint + 3 query = "INSERT INTO BarrelRecipeHistory (SerialNumber, StepNumber, TempSetpoint, TempActual, TimeStamp) VALUES ('%s', %d, %d, %d, Current_TimeStamp)" %(SerialNumber, StepNumber, TempSetpoint, TempActual) fpmi.db.runUpdateQuery(query, "ENG_TEMP") fpmi.db.refresh(event.source.parent.getComponent('Chart'), "TempActual") #Stop Timer if 5 Minutes Past End of Profile if (event.source.value > (event.source.parent.getComponent('NumSteps').value) + 30): event.source.parent.Running = 0

I am having a problem where “TempSP” does not update before the action script in “CurrentStep” is ran. This used to work.

Travis suggested that I use the fpmi.system.invokeLater(function). I have not been able to add that to my script without getting errors?
My attempt is shown below, but I get the error: (NameError: TempSetpoint)

if event.propertyName == "value":
	#Stop Timer if 5 Minutes Past End of Profile
	if (event.source.value > (event.source.parent.getComponent('NumSteps').value) + 30):
		event.source.parent.Running = 0  

	def LogTemperature(SerialNumber = event.source.parent.getComponent('SerialNumber').text, TempSetpoint = event.source.parent.getComponent('TempSP').value, StepNumber = event.source.value, TempActual = TempSetpoint + 3): 

		query = "INSERT INTO BarrelRecipeHistory (SerialNumber, StepNumber, TempSetpoint, TempActual, TimeStamp) VALUES ('%s', %d, %d, %d, Current_TimeStamp)" %(SerialNumber, StepNumber, TempSetpoint, TempActual)
		fpmi.db.runUpdateQuery(query, "ENG_TEMP")
		fpmi.db.refresh(event.source.parent.getComponent('Chart'), "TempActual")

	fpmi.system.invokeLater(LogTemperature)

Thank you for your help.
Jake

I called Travis and I think I have this issue resolved. You need to pass the event to your definition, and import fpmi inside of the function. To get the object values AFTER the “invokeLater” command, you must put them inside of the function. (Do not pass them to it). The correct script is shown below:

if event.propertyName == "value":
	#Stop Timer if 5 Minutes Past End of Profile
	if (event.source.value > (event.source.parent.getComponent('NumSteps').value) + 30):
		event.source.parent.Running = 0  
	#Log SerialNumber, StepNumber, TempSP, TempACT to BarrelRecipeHistory
	def LogTemperature(event = event): 
		import fpmi
		SerialNumber = event.source.parent.getComponent('SerialNumber').text
		TempSetpoint = event.source.parent.getComponent('TempSP').value
		StepNumber = event.source.value
		TempActual = 3
		query = "INSERT INTO BarrelRecipeHistory (SerialNumber, StepNumber, TempSetpoint, TempActual, TimeStamp) VALUES ('%s', %d, %d, %d, Current_TimeStamp)" %(SerialNumber, StepNumber, TempSetpoint, TempActual)
		fpmi.db.runUpdateQuery(query, "ENG_TEMP")
		fpmi.db.refresh(event.source.parent.getComponent('Chart'), "TempActual")
	fpmi.system.invokeLater(LogTemperature)