c++ 线程的死循环问题

一个猜数字的游戏,采用双线程,第一局游戏正常,结束后会弹出是否继续游戏的提示,可是无论是我选择继续还是退出游戏,要么开始死循环,要么就是跳转到请输入一个数,疯狂循环,不会改了

img


img


下面是我的代码
是main函数里while写的不对嘛

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <windows.h>
using namespace std;
clock_t Begin, End;
double g_Time;
int g_n, g_num, g_sec, g_flag;
DWORD WINAPI Timer(LPVOID lpParameter)
{
    while (g_flag)
    {
        End = clock();
        Sleep(10);
    }
    return 0;
}
DWORD WINAPI Gamer(LPVOID lpParameter)
{
    while (g_flag)
    {
        cout << "请输入一个数(1-10000):";
        cin >> g_n;
        if (g_n > g_num)
        {
            cout << "太高" << endl;
        }
        else if (g_n < g_num)
        {
            cout << "太低" << endl;
        }
        else
        {
            g_flag = 0;
            return 0;
        }
    }
    return 0;
}
class Thread
{
public:
    HANDLE h1, h2;
    void Create()
    {
        h2 = CreateThread(NULL, 0, Gamer, NULL, 0, NULL);
        h1 = CreateThread(NULL, 0, Timer, NULL, 0, NULL);
    }
};
class Game
{
public:
    void Play()
    {
        int op = 0;
        g_flag = 1;
        srand((unsigned int)time(NULL));
        g_num = rand() % 10000 + 1;
        Thread T;
        cout << "请输入游戏时间(单位为秒):";
        cin >> g_sec;
        g_Time = 0;
        Begin = clock();
        T.Create();
        while (g_Time < g_sec && g_flag)
        {
            g_Time = double(End - Begin) / CLOCKS_PER_SEC;
        }
        if (g_flag == 0)
        {
            cout << "正确猜出数:" << g_num << endl;
        }
        else
        {
            cout << endl
                 << "游戏超时,该数字为:" << g_num << endl;
        }
    }
};
int main()
{
    char op;
    while (1)
    {
        Game Gamer;
        Gamer.Play();
        cout << "游戏结束,输入1退出游戏,输入其它键重新开始。" << endl;
        cin >> op;
        if (op == '1')
        {
            break;
        }
    }
    return 0;
}

重新开始时需要把全局变量重置。

img

代码修改如下:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <windows.h>
using namespace std;
clock_t Begin, End;
double g_Time;
int g_n, g_num, g_sec, g_flag;
DWORD WINAPI Timer(LPVOID lpParameter)
{
    while (g_flag)
    {
        End = clock();
        Sleep(10);
    }
    return 0;
}
DWORD WINAPI Gamer(LPVOID lpParameter)
{
    while (g_flag)
    {
        cout << "请输入一个数(1-10000):";
        cin >> g_n;
        if (g_n > g_num)
        {
            cout << "太高" << endl;
        }
        else if (g_n < g_num)
        {
            cout << "太低" << endl;
        }
        else
        {
            g_flag = 0;
            return 0;
        }
    }
    return 0;
}
class Thread
{
public:
    HANDLE h1, h2;
    void Create()
    {
        h2 = CreateThread(NULL, 0, Gamer, NULL, 0, NULL);
        h1 = CreateThread(NULL, 0, Timer, NULL, 0, NULL);
    }
    //等待线程执行完毕返回
    void Wait()
    {
        WaitForSingleObject(h1, INFINITE);
        WaitForSingleObject(h2, INFINITE);
    }
};
class Game
{
public:

    void Play()
    {
        //int op = 0;
        g_flag = 1;
        
        g_num = rand() % 10000 + 1;
        Thread T;
        cout << "请输入游戏时间(单位为秒):";
        cin >> g_sec;
        g_Time = 0;
        Begin = clock();
        T.Create();
        while (g_Time < g_sec && g_flag)
        {
            g_Time = double(End - Begin) / CLOCKS_PER_SEC;
        }
        if (g_flag == 0)
        {
            cout << "正确猜出数:" << g_num << endl;
        }
        else
        {
            cout << endl << "游戏超时,该数字为:" << g_num << endl;
            g_flag = 0; //这里让已有线程终止
            
        }
        T.Wait();
    }
};
int main()
{
    int op;
    srand((unsigned int)time(NULL)); //这个执行一次即可
    Game Gamer; //这个放在while外面即可
    while (1)
    {
        Gamer.Play();
        cout << "游戏结束,输入1退出游戏,输入其它键重新开始。" << endl;
        cin >> op;
        if (op == 1)
        {
            break;
        }
    }
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632