neděle 14. září 2014

Časovače ve službách

Toto je jen zamyšlení, jak správně používat časovače pro opakované spouštění operací. Obvykle se to řeší takto:

private int interval = 3600000;
private Timer timer = new Timer(2000);

public void Start()
{
   this.timer.Elapsed += this.OnTimerElapsed;
   this.timer.Start();
}

private void OnTimerElapsed(object sender, ElapsedEventArgs e)
{
   this.timer.Stop();
   .....
   this.timer.Interval = this.interval;
   this.timer.Start();
}


Drobným nedostatkem tohoto kódu je fakt, že kód vlastně neběží v nastaveném intervalu, ale tento interval je prodloužen i o vlastní běh metody - například pokud je interval nastaven na 10 sekund a metoda běží  také 10 sekund, uplyne mezi dvěma voláními 20 sekund.

Takže tady je lepší řešeni- použije se System.Threading.Timer - ten umožňuje nastavit jak čas prvotního spuštění, tak interval mezi následnými voláními.

private Timer timer = null;
private readonly TimerSemaphore semaphore = new TimerSemaphore();

public void Start()
{
   int interval = 3600000;
   this.timer = new Timer(new TimerCallback(this.OnTimerElapsed), null, 200, interval);
}

private void OnTimerElapsed(object state)
{
   if (this.semaphore.IsRunning) return;

   do
   {
       ...
    } while (this.semaphore.ShouldBeRunning);
}

Objekt semaphore zabraňuje opětovnému spuštění metody, pokud tato již běží a navíc v případě, že dojde k tomuto opětovnému zavolání spustí metodu ihned znovu - takže pokud metoda běží pomaleji a doba běhu překročí nastavený interval, je metoda volána ihned znovu - na rozdíl od prvního kódu, kde se opětovně čeká.

Takto vypadá vlastní kód třídy TimerSemaphore:

public class TimerSemaphore
{
 private bool isRunning = false;
 private bool shouldBeRunning = false;
 private bool isStopped = false;
 private object locker = new object();
    
 public bool IsRunning
 { 
  get 
  { 
   lock(this.locker)
   {
    if (this.isStopped)
     return false;
    if(!this.isRunning)
    {
     this.isRunning = true;
     return false;
    }
    else
    {
     this.shouldBeRunning = true;
     return true;
    }
    
   }
  } 
 }

 public bool ShouldBeRunning
 {
  get
  {
   lock(this.locker)
   {
    if this.isStopped)
     return false;
    if(this.shouldBeRunning)
    {
     this.isRunning = true;
     this.shouldBeRunning = false;
     return true;
    }
    else
    {
     this.isRunning = false;
     return false;
    }
   }
  }
 }

 public void Stop()
 {
  lock(this.locker)
  {
   this.isRunning = false;
   this.shouldBeRunning = false;
   this.isStopped = true;
  }
 }
}





sobota 6. září 2014

Datové připojení ve Francii

Při cestách mimo ČR mi vadí docela vysoké poplatky za data v zahraničí (i když jsou země EU zahraničí?). Obecně se snažím moc nevázat, navíc používám tablet se SIM kartou a raději si data v ČR kupuju na předplacence. Ale v zahraničí je problém, u Mobil.cz si lze koupit balíček na měsíc - za 100MB chtějí 185 Kč. A nebo přímo u T-Mobile platit balíček za den (měsíční balíčky pro předplacené karty zrušili). Vím, že existují další možnosti, třeba připojení od Vodafone - ale ani jedno není moc cenově výhodné.


Při letošní cestě do Francie jsem se tedy rozhodl koupit místní SIM od poskytovatele Lebara. SIM kartu si lze objednat buď předem poštou - což jsem nezkoušel -   a nebo koupit na místě v trafikách (Tabaco). Což jsem nakonec udělal. Stála €5 a musí se aktivovat.

Aktivace přes formulář na internetu mi nešla, takže jsem musel volat zákaznickou linku (čislo je v balíčku, který si koupíte a voláte bezplatně). Je to sice trochu zdlouhavé, většinu údajů musíte hláskovat (operátor mluví anglicky), ale tak během 10 minut je karta aktivována. Uvádíte jméno, bydliště a číslo pasu.

Nyní zbývá jen dobít kredit a vybrat si tarif. Dobil jsem €20 a aktivoval si tarif 3GB na měsíc za €15 - přehled všech nabídek na datové připojení je zde. Vše lze provést po internetu, jen musíte mít ještě jiné připojení, neboť SIM karta není před dobitím aktivní - vhodné je využít wifi v hotelu, u McDonalds apod.

Bohužel po dobití karta nezačne automaticky fungovat pro datové připojení. Je nutné nastavit ručně APN konfiguraci. Pokud si nevíte rady, můžete zavolat na podporu (tahle je ale již placená, na rozdíl od registrace) a tam vám slíbí poslat konfigurační data SMS. Ale alespoň mne nic neposlali, takže jsem musel googlit a najít toto nastavení (v oficiálních materiálech mají heslo prázdné, ale mne to bez něj nepracovalo):

APN: fr.lebara.mobi
User: wap
Password: 1234

(Nastavení -:Bezdrátovaá připojení a sítě -> Další-> Mobilní sítě->Názvy přístupových bodu (APN) - Přidat)

A pak to už normálně funguje a za celkových cca 700Kč jsou k dispozici 4GB dat (dostáváte nějaké bonusy za dobití). Český operátor vám za tuhle částku v roamingu dodá tak desetkrát méně dat.  Jsou možné i jiné kombinace, třeba 1.1GB za €15 (cca 420 Kč) a podobně. 

Karta by měla jít koupit na těchto místech: