gpt4 book ai didi

c++ - 同时运行同一类的对象

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:31 24 4
gpt4 key购买 nike

我从昨天开始学习 C++,我想编写一个警报系统,让用户使用 Alarm 对象设置自己的警报。我尝试的方法本身就可以正常工作,但只允许用户运行一个:如果我尝试使用 start 方法启动第二个警报,程序会等待第一个警报“响起”以启动第二个。

如何同时运行两个警报?感谢您花时间阅读本文。(OSX Sierra,Xcode 8.2)

main.cpp

using namespace std;

int main(int argc, const char * argv[]) {
Alarm test(12, 12, "foo");
test.start();

Alarm.hpp

class Alarm {
public:
Alarm(int hour, int minute, std::string speech);
void start();
void stop();
bool isStopped() const;
std::string getStats() const;

private:
int m_hour;
int m_minute;
std::string m_speech;
bool m_stopped;
};

报警.cpp

using namespace std;

Alarm::Alarm(int hour, int minute, string speech) {
m_hour = hour;
m_minute = minute;
m_speech = speech;
m_stopped = false;
}

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 = true;
}
else {
this_thread::sleep_for(chrono::milliseconds(60000));
}
}
}

void Alarm::stop() {
m_stopped = true;
}

bool Alarm::isStopped() const {
return m_stopped;
}

最佳答案

我能想到的最简单的方法是使用 std::thread 小号:

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);

while(!test1.isStopped() && !test2.isStopped()) {
this_thread::sleep_for(chrono::milliseconds(60000));
}

t2.join();
t1.join();
}

并保护m_stopped带有 std::mutex 的成员变量, std::atomic 或类似的:

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();
}

请注意我在上面的示例中所做的有关复制构造函数和赋值运算符定义的更改,以处理 std::atomic<bool>成员正确。


我有一个可编译的版本 here ,使用正确的参数,它应该会成功并及时完成。

关于c++ - 同时运行同一类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41229227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com