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

问题描述 投票:0回答:1

我注意到我的 SDLD2/C++ 应用程序无法正常工作,或者我没有进行任何更改。所以我尝试在 Ubuntu 22.04 VM 上执行它并且它有效。经过几次测试后,我注意到如果我从 std::tread Tread 函数中取出渲染函数,它就会重新工作。但是我的程序现在在“程序”功能未完成时卡住了。

这是我的代码(在注释之前的线程实现中):

#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;
}

如何正确处理我的“程序”功能需要时间但我希望能够随时退出应用程序的情况,因此我的事件循环也需要可访问。

c++ multithreading ubuntu rendering sdl-2
1个回答
0
投票

您需要将生成和求解代码与渲染分开。 最简单的方法就是将程序切成两半,在它们之间使用单个共享变量来传达状态。

在这种情况下,状态真的只是

maze

在主循环中,提前生成

squares
。然后,对于游戏循环的每次迭代,从
maze
读取状态并更新
squares
以匹配。
在线程中,解决迷宫并将结果写回
maze
或辅助共享数据结构。

© www.soinside.com 2019 - 2024. All rights reserved.