Enclave_ 2022-07-05 15:36 采纳率: 88.5%
浏览 134
已结题

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;
}
  • 写回答

2条回答 默认 最新

  • 关注

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

    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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月13日
  • 已采纳回答 7月5日
  • 创建了问题 7月5日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来