//: C11:Interrupting3.cpp {RunByHand}
// Z knihy "Myslíme v jazyce C++, část 2" od Bruce Eckela a Chucka Allisona.
// (c) 1995-2004 MindView, Inc. Všechna práva vyhrazena.
// Přečtěte si podmínky používání zdrojových kódů umístěné v souboru 
// 'Licence.txt' dodávaném spolu s balíčkem kódu dostupným na www.MindView.net.
// Obecný idiom pro ukončení úkolu.
//{L} ZThread
#include <iostream>
#include "zthread/Thread.h"
using namespace ZThread;
using namespace std;

const double PI = 3.14159265358979323846;
const double E = 2.7182818284590452354;

class PotrebujeUklidit {
  int id;
public:
  PotrebujeUklidit(int ident) : id(ident) {
    cout << "PotrebujeUklidit " << id << endl;
  }
  ~PotrebujeUklidit() {
    cout << "~PotrebujeUklidit " << id << endl;
  }
};

class Blocked3 : public Runnable {
  volatile double d;
public:
  Blocked3() : d(0.0) {}
  void run() {
    try {
      while(!Thread::interrupted()) {
        point1:
        PotrebujeUklidit n1(1);
        cout << "Spí" << endl;
        Thread::sleep(1000);
        point2:
        PotrebujeUklidit n2(2);
        cout << "Počítá" << endl;
        // Časově náročná, neblokující operace:
        for(int i = 1; i < 100000; i++)
          d = d + (PI + E) / (double)i;
      }
      cout << "KOnec prostřednictvím testu v cyklu while()" << endl;
    } catch(Interrupted_Exception&) {
      cout << "Konec prostřednictvím Interrupted_Exception" << endl;
    }
  }
};

int main(int argc, char* argv[]) {
  if(argc != 2) {
    cerr << "Použití: " << argv[0]
      << " prodleva-v-milisekundach" << endl;
    exit(1);
  }
  int delay = atoi(argv[1]);
  try {
    Thread t(new Blocked3);
    Thread::sleep(delay);
    t.interrupt();
  } catch(Synchronization_Exception& e) {
    cerr << e.what() << endl;
  }
} ///:~
