Delphi TTask Android service helyes használata

Delphi TTask Android service helyes használata
2016-06-07T19:12:06+02:00
2016-06-08T16:45:34+02:00
2022-12-03T18:35:37+01:00
wsx
Lehetséges, hogy nem vagyok teljesen tiszában azzal, hogy a TTask-ot hogyan kell Delphi-ben használni. 

Létrehoztam egy task-ot az Android service create eseményében:

syncTask := ttask.Create(SyncMysqlDatabase);
Ezután használok egy locationsensor komponenst, amelynek amikor meghívódik a locationchange eseménye, akkor egy szinkronizációt szeretnék indítani a MySQL adatbázis felé.

if (syncTask.Status <> ttaskstatus.Running) then begin logi('syncTask.Start'); syncTask.Start; end;

Miután a task lefutott a következő kivételt kapom:

Cannot start a task that has already completed

Bizonyára valamit félreértettem a help-ben, vagy valamit kihagytam, amire szükség lenne, de nekem az lenne a lényeg, hogy ha a task már fut, akkor ne indítsa el újra. Ha viszont lefutott, akkor újra el kell indítsa, amikor végrehajtódik a locationsensor locationchange eseménye.
Mutasd a teljes hozzászólást!
Ha viszont lefutott, akkor újra el kell indítsa, amikor végrehajtódik a locationsensor locationchange eseménye.

Ez az, ami nincs. Újat kell létrehoznod.
Olvasd el a hibaüzenetet, szinte a Google Translate is érti (szinte...). Egyébként ez kb. minden környezetben így van: lefutott processzt, szálat, taszkot nem lehet újra lefuttatni. A "taszkság" lényege az, hogy "olcsóbb" létrehozni, mint egy szálat, tehát pont arra van kitalálva, hogy aggódás nélkül hozhass létre belőle újakat.
Mutasd a teljes hozzászólást!

  • Rendben, értem. Viszont hogy csináljam? A locationsensor onlocatiomchage - je folyamatosan végrehajtódik. A taskot csak akkor akarom újra létrehozni, amikor a korábbi már lefutott. Addig viszont, ameddig nincs létrehozva, nem vizsgalhatom azt, hogy fut - e még.
    Mutasd a teljes hozzászólást!
  • Az előzőt tudod nézni, hogy fut-e még. Ha jól látom (System.Threading.TTaskStatus - RAD Studio API Documentation ), Completed lesz, ha lefutott. Ekkor újat kell létrehozni és el is indítani.
    Mivel az összes többi állapota is "gyanús" (szóval nem sok jót jelent), én valami ilyesmit csinálnék:

    if (syncTask = nil) then begin syncTask := ttask.Create(SyncMysqlDatabase); syncTask.Start; end else begin if(syncTask.Status<>ttaskstatus.Running) then begin syncTask := ttask.Create(SyncMysqlDatabase); syncTask.Start; end; end;
    Csak azért lett ilyen, mert ha jól emlékszem, a Pascal hajlamos mindent kiértékelni. De ha a (syncTask=nil)or(syncTask.Status<>ttaskstatus.Running) feltétel is működik, az persze jobb.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd