C++线程导致SDL2渲染问题(自Ubuntu 23.10起)

r3i60tvu  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(161)

我注意到我的SDLD 2/C++应用程序不能正常工作,或者我没有做任何修改。所以我试着在Ubuntu 22.04虚拟机上执行它,它工作了。经过几次测试,我注意到如果我从std::tread Tread函数中取出我的渲染函数,它会重新工作。但是当“program”函数没有完成时,我的程序就会卡住。
下面是我的代码(在前面的线程实现的注解中):

#include <SDL2/SDL.h>   
#include <array>
#include <cstdlib>    
#include <time.h>
#include <thread>
#include "const.hpp"
#include "maze_crea.hpp"
#include "maze_solver.hpp"

void program(SDL_Window* pWindow, SDL_Renderer* pRenderer){
    std::array<int, MAZE_SIZE<int>> maze;
    std::array<SDL_Rect, MAZE_SIZE<int>> squares;

    for (int i = 0; i < MAZE_SIZE<int>; i++){
        squares[i] = { (i % SIDE_SIZE<int>) * (WIDTHSCREEN<int> / SIDE_SIZE<int>), (i / SIDE_SIZE<int>) * (HEIGHTSCREEN<int> / SIDE_SIZE<int>), WIDTHSCREEN<int> / SIDE_SIZE<int>, HEIGHTSCREEN<int> / SIDE_SIZE<int> };
        if (((i % SIDE_SIZE<int>) % 2 == 0) || ((i / SIDE_SIZE<int>) % 2 == 0)){
            maze[i] = 0;
        } else {
            maze[i] = i;
        }
    }

    SDL_SetWindowTitle(pWindow, "Maze Solver (creation)");
    mazeCrea(pRenderer, maze, squares);
    SDL_SetWindowTitle(pWindow, "Maze Solver (solution)");
    mazeSolver(pRenderer, maze, squares);
}

int main(int argc, char* argv[])
{
     if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "[DEBUG] > %s", SDL_GetError());
        return EXIT_FAILURE;
    }

    SDL_Window* pWindow{ nullptr };
    SDL_Renderer* pRenderer{ nullptr };

     if (SDL_CreateWindowAndRenderer(WIDTHSCREEN<unsigned int>, HEIGHTSCREEN<unsigned int>, SDL_WINDOW_SHOWN, &pWindow, &pRenderer) < 0)
    {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "[DEBUG] > %s", SDL_GetError());
        SDL_Quit();
        return EXIT_FAILURE;
    }

    srand(time(NULL));

    //std::thread Thread(program, pWindow, pRenderer);
    program(pWindow, pRenderer);

    SDL_Event events;

     while (true)
    {
         while (SDL_PollEvent(&events))
        {
            switch (events.type)
            {
            case SDL_QUIT:
                SDL_DestroyRenderer(pRenderer);
                SDL_DestroyWindow(pWindow);
                SDL_Quit();
                return EXIT_SUCCESS;
                break;
            }
        }
    }

    //Thread.join();

    SDL_DestroyRenderer(pRenderer);
    SDL_DestroyWindow(pWindow);
    SDL_Quit();

    return EXIT_SUCCESS;
}

字符串
如何正确处理的情况下,我的“程序”funcntion需要时间,但我希望能够退出应用程序在任何时候,所以我的事件循环也需要访问。

col17t5w

col17t5w1#

你需要将生成和求解代码从渲染中分离出来。最简单的方法就是将程序一分为二,在它们之间使用一个共享变量来传递状态。
在这种情况下,状态实际上只是maze
在主循环中,预先生成squares。然后在游戏循环的每次迭代中,从maze读取状态并更新squares以匹配。
在线程中,解决迷宫并将结果写回maze或辅助共享数据结构。

相关问题