web
You’re offline. This is a read only version of the page.
close
Skip to main content

Notifications

Announcements

Community site session details

Community site session details

Session Id :
Power Platform Community / Forums / Power Apps / Monitor Timer value
Power Apps
Unanswered

Monitor Timer value

(0) ShareShare
ReportReport
Posted on by 1,142

Thank you for taking the time to read my question.

 

I have a timer that currently loops every 15 seconds. OnTimerEnd I save something to a collection.

 

My problem is, it seems that by the time I save to the collection and then reset the timer so it loops more than an second passes and my timer develops lag (for lack of a better term). I put another timer on my screen and start them at the same time (as close as I can) and as I watch them, the times diverge.

 

Is there a way to monitor the Timer.Value and then do something like IF(Mod(Timer.Value,15000) = 0,Do my stuff)?

 

I tried setting a variable to true and then setting a TextInput default value to the variable. Then I tried to use the OnChange event, but it didn't seem to fire.

 

Thanks

Categories:
I have the same question (0)
  • BCLS776 Profile Picture
    8,994 Moderator on at

    You are probably seeing effects from things like:

    • Network latency
    • Virtual machine response time
    • Power Apps' execution framework (code does not execute in the order it is written or when you think it might)

    and those all affect how a timer runs, relative to itself. Could your solution work better if you refer to an absolute time reference, such as the timestamp generated by the Now() function?

     

  • iwonder Profile Picture
    1,142 on at

    Hi @BCLS776 

     

    thank you very much for your reply 

     

    @what I’m doing is every 15 seconds I want to record my GPS location, the time and then using the Bing Maps API get the distance travelled between my first record and my current location. 
    When I do this, my time stamps start at 15 seconds and grow from there. 

    how can I run something every 15 seconds without delaying my time? Not sure how to check the now function other than using a timer. 

  • BCLS776 Profile Picture
    8,994 Moderator on at

    My thought is, rather than relying on a timer to give you 15.00 second intervals back to back, call Now() about every 15 seconds and calculate the time difference since the last time Now() was called using the timestamp values. This gives you an absolute standard of time (UTC) rather than a relative standard (when the timer repeats again). Especially over the long term, this is less likely to experience the clock drift you are seeing.

  • iwonder Profile Picture
    1,142 on at

    Hi @BCLS776 

     

    Thanks again for your reply. 

     

    The part I don't understand is where to put the Now(). If I put that in the OnTimerEnd, doesn't that delay the timer counting and then my 15 second interval will be delayed until all my code executes.

     

    I was thinking that if I could trigger only one thing, like changing a variable to true from false, the timer would have an easier time and be able to reset faster and begin the cycle sooner, thus having less lag due to the actions required at the OnTimerEnd. Then something else could execute my code while the timer is counting.

     

    My current code:

     

    Collect(
     colLocHist,
     {
     CaptureDateTime: Now(),
     Lat: Location.Latitude,
     Long: Location.Longitude,
     PinIcon: Marker
     }
     );
     UpdateIf(
     colLocHist,
     IsBlank(DistTrav),
     {
     DistTrav: If(
     !IsEmpty(colLocHist),
     BingMaps.GetRoute(
     Text(Last(colLocHist).Lat & "," & Last(colLocHist).Long),
     Text(varLat & "," & varLong),
     {
     distanceUnit: "Kilometer",
     travelMode: "Walking"
     }
     ).travelDistance,
     0
     )
     }
     )
    ;
    Set(
     varTimer,
     !varTimer
    );
    Set(
     varTimer,
     !varTimer
    );
    //varTimer is either true or false and is used in the Start parameter of the timer

     

     

    maybe it's the BING API call that's taking the "extra" time. I'm using it to calculate the distance travelled from the current GPS location from the previous GPS Location. I don't think there is a way to do that well in PowerApps.

     

    Thanks

  • BCLS776 Profile Picture
    8,994 Moderator on at

    You are right, API calls take time and you have no control over exactly how long those take.

     

    I like this code of yours:

    Collect(
     colLocHist,
     {
     CaptureDateTime: Now(),
     Lat: Location.Latitude,
     Long: Location.Longitude,
     PinIcon: Marker
     }
     );

    Simple and as quick to execute as anything in Power Apps.

     

    Now, help me understand why you want to calculate position/distance every 15.00 seconds and why it is a problem if the interval is 15.1, or 15.2 seconds? If you are doing some sort of subsequent calculation that involves time, you now have timestamps that you can calculate the time difference between. Instead of assuming each interval is 15.00 seconds, use the timestamp from your latest record and the one before it.

  • iwonder Profile Picture
    1,142 on at

    In my app, above the map where I plot the GPS locations (can't wait until the Route feature is released) I have a label that shows the total distance travelled so far and the total time travelled so far. Once the user clicks the stop button, it grabs the current location and time and then they get the final measures.

     

    The elapsed time only increases after the timer reaches 15 seconds, so I thought it would be nice to see the time counting the whole time, like a timer.... so I added a second timer that loops on one second and I increase a variable by that one second and show the elapsed time in hh:mm:ss. This is where I noticed that my 15 second timer is not taking measurements every 15 seconds. 

     

    When I clicked stop, my elapsed time as counted by the one second timer was different than the datediff() of the first record in the collection to the last record in the collection. My thought was it's because of the lag in my 15 second timer... but maybe not?

     

    Just trying to get an accurate elapsed time. Maybe I go for a run (unlikely, but maybe :-)) and I want to know my average speed. If my time is off, then I can't get an accurate speed.

     

    I take the reading every 15 seconds because if I stop where I started, and use those 2 readings to calculate my distance I won't have travelled very far. If I start and stop at different locations, then my distance travelled may not be based on the route I actually took, or it may be as the crow flies... not 100% sure what the BING Maps API does here.

     

    App Running:

    apprunning.PNG

     

    App Stopped:

    appstopped.PNG

    The Travel Time will not necessarily be in 15 second intervals when the user taps the stop button because they can stop it whenever they like.

     

    Thanks agian

  • BCLS776 Profile Picture
    8,994 Moderator on at

    Relying on the API calls will cause a lot of the delays you are seeing, and these delays could get worse if you have marginal connectivity.

     

    Rather than using the API to calculate your distance, care to give the Haversine Formula a try?

     

    Use the API for its display & map capabilities, but try to do the math inside of Power Apps. Also, keep in mind that Power Apps does not execute code as sequentially as it appears to you. It takes a lower-level language to control execution to the degree that you can rely on relative timing.

  • iwonder Profile Picture
    1,142 on at

    I did find that formula but I have NO IDEA how to put that into PowerApps. I would also save me having to sign up for access to the BING Maps API.

     

    If you can point me in a direction, I'll gladly follow that and try to figure it out. Just not sure where/how to start

  • Verified answer
    BCLS776 Profile Picture
    8,994 Moderator on at

    OK, the Power Apps documentation is your friend 🙂

     

    Start by converting your latitudes and longitudes into radians using the Radians() function. These formulas do not work with decimal degrees.

     

    Then, use this form of the haversine formula to calculate distance:

    BCLS776_0-1626275964095.png

    I am happy to check your coding of this formula, which will run VERY fast compared to the API call.

  • iwonder Profile Picture
    1,142 on at

    ok..... I have this so far

     

    sLat = starting Latitude

    sLong = starting Longitude

     

    eLat = ending Latitude

    eLong = ending Longitude

     

    Asin(Sqrt(Power(Sin((Radians(eLat)-Radians(sLat))/2),2)+(Cos(sLat)*Cos(eLat)*Power(Sin((Radians(eLong)-Radians(sLong))/2),2))))

     

    I think I have the formula right so far, I'm just not sure how to do 2r * all the above?

     

    r is the radius of the sphere....

     

    what sphere? the earth?

     

    Sorry if I'm so clueless here...

     

    Thanks

Under review

Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.

Helpful resources

Quick Links

Forum hierarchy changes are complete!

In our never-ending quest to improve we are simplifying the forum hierarchy…

Ajay Kumar Gannamaneni – Community Spotlight

We are honored to recognize Ajay Kumar Gannamaneni as our Community Spotlight for December…

Leaderboard > Power Apps

#1
WarrenBelz Profile Picture

WarrenBelz 796 Most Valuable Professional

#2
Michael E. Gernaey Profile Picture

Michael E. Gernaey 327 Super User 2025 Season 2

#3
Power Platform 1919 Profile Picture

Power Platform 1919 268

Last 30 days Overall leaderboard