On Sunday 16 March 2014 16:17:04 Ove Kåven wrote:
> Den 16. mars 2014 14:14, skrev Arvid Fahlström Myrman:
> > Yes, I've been playing around with BackgroundJob from nemo-keepalive a
> > little since I wrote that. It seems to mostly work similarly to
> > Insomniac, with the added benefit of preventing suspend after triggering
> > until BackgroundJob's finished() method is called. It's a bit finicky to
> > use though, since it seems to always trigger once immediately upon being
> > enabled, and it doesn't have a repeat property that can be set to false,
> > so to prevent it from running more than once you have to set enabled to
> > true when it's triggered and hope that it doesn't have time to schedule
> > the next event
> 
> "Set enabled to true"? Do you mean setting it to false? Or how exactly
> are you using it? As far as I can tell, you should set enabled to true
> to start the timer, and enabled to false to stop it.

Yes, you're right, I meant to write "false".

> You should probably set enabled to false *after* your job is done,
> because setting it to false will also do what finished() does.
> 
> If the timer were to elapse again before you're done, this would be
> ignored as long as you haven't called finished or set enabled to false.
> So you shouldn't be getting more than one trigger of this kind (in theory).

After testing some more, it seems that my problem was that I was setting 
enabled to false after running finished(). Take this code for example, which is 
a simplified version of my original test:


Item {
  Component.onCompleted: backgroundJob.enabled = true

  property real startTime: Date.now()

  Timer {
    id: timer
    repeat: false
    interval: 1000
    property int i: 0
    onTriggered: {
      i += 1
      console.log("Timer triggered at", Date.now() - startTime,
                  "milliseconds since application start")
      console.log("Timer has been triggered", i, "time(s)")
      backgroundJob.finished()
      if (i == 2) {
        backgroundJob.enabled = false
        console.log("BackgroundJob disabled at", Date.now() - startTime,
                    "milliseconds since application start")
      }
    }
  }

  BackgroundJob {
    id: backgroundJob
    frequency: BackgroundJob.Range
    minimumWait: 10
    maximumWait: 15
    onTriggered: {
      console.log("BackgroundJob triggered at", Date.now() - startTime,
                  "milliseconds since application start")
      timer.start()
    }
  }
}


Intuitively, I would expect backgroundJob to cease all activity when enabled 
is set to false, meaning that I would only expect the Timer to trigger two 
times in total. However, in reality the output that I get is the following:

BackgroundJob triggered at 71 milliseconds since application start
Timer triggered at 1121 milliseconds since application start
Timer has been triggered 1 time(s)
BackgroundJob triggered at 21374 milliseconds since application start
Timer triggered at 22379 milliseconds since application start
Timer has been triggered 2 time(s)
BackgroundJob disabled at 22389 milliseconds since application start
BackgroundJob triggered at 38367 milliseconds since application start
Timer triggered at 39371 milliseconds since application start
Timer has been triggered 3 time(s)

If I move backgroundJob.finished() to after the if statement the timer only 
triggers two times in total, however. I'm not sure if this should be 
considered a bug or what (maybe it makes some amount of sense somewhere down 
the line), but I would definitely not expect another triggered signal after 
having set enabled to false.

> To start the timer using a range (instead of just a frequency), set the
> minimumWait and maximumWait properties as desired, and the frequency
> property to "Range". Then start the timer by setting enabled to true.
> (The timer should not be enabled before you've set all these properties,
> or you might risk funny effects.)
> 
> > Regarding timed, I have looked at nemo-qml-plugin-alarms previously, but
> > from what I could tell (though I'll admit I didn't really take the time
> > to actually understand how it works, so it's very possible that I wasn't
> > using it correctly) it is not really possible to schedule a specified
> > piece of code for execution using it;
> 
> With the C++ interface it's possible (well, at least it's possible to
> start any program or send any D-Bus message). Perhaps the QML interface
> is less flexible in that regard...
> 
> _______________________________________________
> SailfishOS.org Devel mailing list

_______________________________________________
SailfishOS.org Devel mailing list

Reply via email to