我想出了将for循环放在一个线程中的想法,所以我所要做的就是暂停或删除线程以打破for循环。但是,它比这复杂一点。我正在制作一个使命召唤现代战争2 mod菜单,它用c ++编码并构建为.dll文件。我已经做到了,所以我称之为迪斯科雾的功能是该菜单中的一个选项。我想做的是让迪斯科雾可以切换。所以这是我到目前为止所尝试的。 (请记住,在每个想法中,线程只是重新创建,而不是被破坏)。
DWORD WINAPI DFOG(LPVOID)
{
if(GetBool("cl_ingame"))
{
for(;;)
{
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 0 0 0.6 1 0 0");
Sleep(250);
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 0.2 0.7 1 1 0 0");
Sleep(250);
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 0.9 0 1 1 0 0");
Sleep(250);
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 0.9 0.4 1 1 0 0");
Sleep(250);
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 1 0 0 1 0 0");
Sleep(250);
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 0 1 0 1 0 0");
Sleep(250);
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 1 1 0 1 0 0");
Sleep(250);
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 0 0 0 1 0 0");
Sleep(250);
}
}
return 0;
}
void DiscoFog(int Client, int Input)
{
HANDLE DF = CreateThread(0,0,DFOG,0,0,0);
if(DiscoFogToggle == false)
{
DiscoFogToggle = true;
ResumeThread(DF);
}
else
{
DiscoFogToggle = false;
SuspendThread(DF);
SV_ClientSendServerCommand(Client, 0, "d 13 0 1 0 0 0 0 0 0");
}
}
正如您所看到的,我已经尝试暂停和恢复线程,但是它只是出于某种原因重新创建线程。以下是我在删除线程并重新创建它以切换迪斯科雾时尝试的内容:
DWORD WINAPI DFOG(LPVOID)
{
if(GetBool("cl_ingame"))
{
for(;;)
{
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 0 0 0.6 1 0 0");
Sleep(250);
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 0.2 0.7 1 1 0 0");
Sleep(250);
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 0.9 0 1 1 0 0");
Sleep(250);
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 0.9 0.4 1 1 0 0");
Sleep(250);
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 1 0 0 1 0 0");
Sleep(250);
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 0 1 0 1 0 0");
Sleep(250);
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 1 1 0 1 0 0");
Sleep(250);
SV_ClientSendServerCommand(-1, 0, "d 13 256 0.00135 0 0 0 1 0 0");
Sleep(250);
}
}
return 0;
}
void DiscoFog(int Client, int Input)
{
HANDLE DF = CreateThread(0,0,DFOG,0,0,0);
if(DiscoFogToggle == false)
{
DiscoFogToggle = true;
DF;
}
else
{
DiscoFogToggle = false;
CloseHandle(DF);
SV_ClientSendServerCommand(Client, 0, "d 13 0 1 0 0 0 0 0 0");
}
}
使用c ++,计算机总是正确的,或者在这种情况下,xbox总是正确的。我不明白的是我能做些什么让我的迪斯科舞会起作用?任何帮助表示赞赏:)
答案 0 :(得分:1)
该线程类似于C ++中的main()函数。为了退出,它需要返回。
所以你需要做的就是向线程发出需要退出的信号。
这通常是通过某种变量来完成的。
e.g。
volatile int global_run = true;
if(GetBool("cl_ingame"))
{
while(global_run)
{
// ...
}
}
// So when global_run == false it'll break out of the loop and the thread will exit.
And then in your main thread,
global_run = false;