#include <iostream>
#include <thread>
#include <atomic>
#include <string>
using namespace std;
class Alarm {
public:
Alarm(int hour, int minute, std::string speech);
Alarm(const Alarm& other);
Alarm& operator=(const Alarm& other);
void start();
void stop();
bool isStopped() const;
// std::string getStats() const;
private:
int m_hour;
int m_minute;
std::string m_speech;
std::atomic<bool> m_stopped;
};
Alarm::Alarm(int hour, int minute, string speech)
: m_hour(hour),m_minute(minute),m_speech(speech),m_stopped(false) {
}
Alarm::Alarm(const Alarm& other)
: m_hour(other.m_hour),m_minute(other.m_minute),m_speech(other.m_speech),m_stopped(other.isStopped()) {
}
Alarm& Alarm::operator=(const Alarm& other) {
m_hour = other.m_hour;
m_minute = other.m_minute;
m_speech = other.m_speech;
m_stopped.store(other.isStopped());
return *this;
}
void Alarm::start() {
int currentHour, currentMinute;
while (!Alarm::isStopped()) {
time_t now = time(NULL);
struct tm *current = localtime(&now);
currentHour = current->tm_hour;
currentMinute = current->tm_min;
if (currentHour == m_hour && currentMinute == m_minute) {
cout << m_speech << endl;
m_stopped.store(true);
}
else {
this_thread::sleep_for(chrono::milliseconds(1000));
}
}
}
void Alarm::stop() {
m_stopped.store(true);
}
bool Alarm::isStopped() const {
return m_stopped.load();
}
int main(int argc, const char * argv[]) {
Alarm test1(12, 12, "foo");
Alarm test2(12, 12, "foo");
std::thread t1(&Alarm::start,test1);
std::thread t2(&Alarm::start,test2);
bool stop2ndThread = false;
while(!test1.isStopped() && !test2.isStopped()) {
this_thread::sleep_for(chrono::milliseconds(1000));
if(!stop2ndThread) {
test1.stop();
}
else {
test2.stop();
}
}
t2.join();
t1.join();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8YXRvbWljPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEFsYXJtIHsKICAgIHB1YmxpYzoKICAgIEFsYXJtKGludCBob3VyLCBpbnQgbWludXRlLCBzdGQ6OnN0cmluZyBzcGVlY2gpOwogICAgQWxhcm0oY29uc3QgQWxhcm0mIG90aGVyKTsKICAgIEFsYXJtJiBvcGVyYXRvcj0oY29uc3QgQWxhcm0mIG90aGVyKTsKICAgIHZvaWQgc3RhcnQoKTsKICAgIHZvaWQgc3RvcCgpOwogICAgYm9vbCBpc1N0b3BwZWQoKSBjb25zdDsKLy8gICAgc3RkOjpzdHJpbmcgZ2V0U3RhdHMoKSBjb25zdDsKCiAgICBwcml2YXRlOgogICAgaW50IG1faG91cjsKICAgIGludCBtX21pbnV0ZTsKICAgIHN0ZDo6c3RyaW5nIG1fc3BlZWNoOwogICAgc3RkOjphdG9taWM8Ym9vbD4gbV9zdG9wcGVkOwp9OwoKQWxhcm06OkFsYXJtKGludCBob3VyLCBpbnQgbWludXRlLCBzdHJpbmcgc3BlZWNoKSAKOiBtX2hvdXIoaG91ciksbV9taW51dGUobWludXRlKSxtX3NwZWVjaChzcGVlY2gpLG1fc3RvcHBlZChmYWxzZSkgewp9CgpBbGFybTo6QWxhcm0oY29uc3QgQWxhcm0mIG90aGVyKSAKOiBtX2hvdXIob3RoZXIubV9ob3VyKSxtX21pbnV0ZShvdGhlci5tX21pbnV0ZSksbV9zcGVlY2gob3RoZXIubV9zcGVlY2gpLG1fc3RvcHBlZChvdGhlci5pc1N0b3BwZWQoKSkgewp9CkFsYXJtJiBBbGFybTo6b3BlcmF0b3I9KGNvbnN0IEFsYXJtJiBvdGhlcikgewoJbV9ob3VyID0gb3RoZXIubV9ob3VyOwoJbV9taW51dGUgPSBvdGhlci5tX21pbnV0ZTsKCW1fc3BlZWNoID0gb3RoZXIubV9zcGVlY2g7CgltX3N0b3BwZWQuc3RvcmUob3RoZXIuaXNTdG9wcGVkKCkpOwoJcmV0dXJuICp0aGlzOwp9Cgp2b2lkIEFsYXJtOjpzdGFydCgpIHsKICAgIGludCBjdXJyZW50SG91ciwgY3VycmVudE1pbnV0ZTsKCiAgICB3aGlsZSAoIUFsYXJtOjppc1N0b3BwZWQoKSkgewogICAgICAgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogICAgICAgIHN0cnVjdCB0bSAqY3VycmVudCA9IGxvY2FsdGltZSgmbm93KTsKCiAgICAgICAgY3VycmVudEhvdXIgPSBjdXJyZW50LT50bV9ob3VyOwogICAgICAgIGN1cnJlbnRNaW51dGUgPSBjdXJyZW50LT50bV9taW47CgogICAgICAgIGlmIChjdXJyZW50SG91ciA9PSBtX2hvdXIgJiYgY3VycmVudE1pbnV0ZSA9PSBtX21pbnV0ZSkgewogICAgICAgICAgICBjb3V0IDw8IG1fc3BlZWNoIDw8IGVuZGw7CiAgICAgICAgICAgIG1fc3RvcHBlZC5zdG9yZSh0cnVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgdGhpc190aHJlYWQ6OnNsZWVwX2ZvcihjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKSk7CiAgICAgICAgfQogICAgIH0KfSAgICAKCnZvaWQgQWxhcm06OnN0b3AoKSB7CiAgICBtX3N0b3BwZWQuc3RvcmUodHJ1ZSk7Cn0KCmJvb2wgQWxhcm06OmlzU3RvcHBlZCgpIGNvbnN0IHsKICAgIHJldHVybiBtX3N0b3BwZWQubG9hZCgpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqIGFyZ3ZbXSkgeyAgICAgICAgCiAgICBBbGFybSB0ZXN0MSgxMiwgMTIsICJmb28iKTsKICAgIEFsYXJtIHRlc3QyKDEyLCAxMiwgImZvbyIpOwoKICAgIHN0ZDo6dGhyZWFkIHQxKCZBbGFybTo6c3RhcnQsdGVzdDEpOwogICAgc3RkOjp0aHJlYWQgdDIoJkFsYXJtOjpzdGFydCx0ZXN0Mik7CgogICAgYm9vbCBzdG9wMm5kVGhyZWFkID0gZmFsc2U7CiAgICB3aGlsZSghdGVzdDEuaXNTdG9wcGVkKCkgJiYgIXRlc3QyLmlzU3RvcHBlZCgpKSB7CiAgICAgICAgIHRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoY2hyb25vOjptaWxsaXNlY29uZHMoMTAwMCkpOwogICAgICAgICBpZighc3RvcDJuZFRocmVhZCkgewogICAgICAgICAJIHRlc3QxLnN0b3AoKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgCSB0ZXN0Mi5zdG9wKCk7CiAgICAgICAgIH0KICAgIH0KCiAgICB0Mi5qb2luKCk7CiAgICB0MS5qb2luKCk7Cn0=