如何打破for循环?

时间:2014-03-23 22:07:42

标签: c++ pthreads infinite-loop break

我想出了将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总是正确的。我不明白的是我能做些什么让我的迪斯科舞会起作用?任何帮助表示赞赏:)

1 个答案:

答案 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;