gpt4 book ai didi

c++ - 线程停止工作 C++

转载 作者:行者123 更新时间:2023-11-28 02:15:11 26 4
gpt4 key购买 nike

我正在用 C++ 编写我的在线应用程序。最近我需要为一个游戏编写一个技能系统,其中一次执行的技能会产生 5 波相同的效果,每波延迟 0.5 秒。我想到了使用线程和 sleep 功能的想法,以防止其他玩家卡住。

所以我的代码是这样的:

struct monster_skill_info
{
monster_skill_info(IMonster *_m, ICharacter *_o) : m(_m), o(_o) {}
IMonster *m;
ICharacter *o;
};

void FireStorm(PVOID v)
{
INTERFACE(Monster)

IMonster *m = ((monster_skill_info*)v)->m;
ICharacter *o = ((monster_skill_info*)v)->o;

for (int i = 0; i < 5; i++)
{
// magic happens here
Sleep(500);
}
}

void ISkill::FireStorm(IMonster* m, ICharacter* o)
{
_beginthread(::FireStorm, 0, (void*)(new monster_skill_info(m, o)));
}

问题是,在 24+ 小时的正常运行时间线程停止工作后。任何技能都无法执行。我确定 _beginthread 停止工作。很难调试,因为它发生在 24 小时甚至更长时间之后。 _beginthread 是否有可能在一段时间后停止工作?我可以用这个做点什么吗?

我应该在 FireStorm(PVOID v) 函数的末尾删除 v; 吗?可能是内存泄漏的问题?

最佳答案

Is it possible that _beginthread stops working after some time?

就其本身而言,不太可能。但是,它可能会因为系统进入的某些情况而失败。

Can I do something with this?

第一道防线是检查 _beginthread 的返回,从而实际查看您认为它不起作用的想法是否有值(value)。如果失败,请检查失败原因 (errno),您可能会知道该怎么做。如果没有失败,请尝试另一个想法。

当然,将其写入某些日志,不要在调试器中执行此操作。

Should I delete v; at the end of FireStorm(PVOID v) function? Might it be problem with memory leaks?

是的,您应该删除 v,在 FireStorm 结束时或在您使用完它后的某个其他时间点。您正在泄漏内存,一段时间后这肯定是个问题。

例如,您的系统可能会变得非常慢,因为它执行了大量的 VM“垃圾处理”。所以,比方说,beginthread 可能实际上并没有失败,只是需要很长时间才能完成。

关于c++ - 线程停止工作 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34244861/

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