gpt4 book ai didi

c++ - 等待 20 秒后才更新数据库记录,以便可以接收到最大记录

转载 作者:太空狗 更新时间:2023-10-29 23:12:41 29 4
gpt4 key购买 nike

等待20秒后才更新数据库记录,这样才能接收到最大记录。

当从工具(将新学生详细信息添加到数据库的工具)添加学生记录时,将发送一个事件,即 RecordChangedEvent,该工具可以同时添加多条记录。

注意:当收到 RecordChangedEvent 时,我必须调用 changed.list 以获取新添加的学生记录

假设我第一次从工具添加 200 条记录,工具发送 200 RecordChangedEvent 但在这里我不想接收 200 个事件,而是我将延迟 20 秒并忽略在此延迟期间发生的事件.

从延迟回来后,我必须调用 changed.list,它将添加所有新添加的记录,这些记录是在延迟 20 秒时出现的,并一次性添加所有记录。

我的问题是我收到 200 RecordChangedEvent 并且延迟了 200*20 秒(这很糟糕)。我想在延迟时忽略所有事件,当它在延迟后返回时,只需从 changed.list

获取更新列表

下面是我的方法(低效)

RecordChangedEvent(void)
{
static bool lock = false;
bool updateNewRecord = false;

// delaying for 20 sec when first event received so that max record can be received
if(!lock)
{
lock = true;
std::this_thread::sleep_for(std::chrono::seconds(20));
updateNewRecord = true;
}
if(updateNewRecord)
{
// adding after 20 sec delay changed.list will have all the updated received records within 20 seconds
AddedRecord(changed.list);
lock = false;
}
}

最佳答案

您需要多个线程调用 RecordChangedEvent。如果您只使用一个线程,该线程将阻塞 20 秒,然后返回,获取下一个事件,然后再次调用 RecordChangedEvent(它将再次等待 20 秒)。因此,当第一个线程处于休眠状态时,您至少还需要一个线程来处理事件。

一旦你有多个线程,你仍然会遇到问题。您的 lock 变量不是线程安全的。有两个线程可以同时进入带有锁的if 的可能性很小。此外,不能保证一个线程中对 lock 的更改将立即在另一个线程中可见。您应该改用标准锁对象。

问题的另一个来源是您在这里使用 changed.list 是不同步的,因为您正在从中读取(复制它以传递给 AddRecord 或在 AddRecord 中(如果您通过引用传递它)而在程序的其他地方,另一个线程可能会尝试向列表中添加新项目。

关于c++ - 等待 20 秒后才更新数据库记录,以便可以接收到最大记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44294209/

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