【问题标题】:c++11 thread not ending in SDLc++11线程未以SDL结尾
【发布时间】:2018-03-15 18:40:18
【问题描述】:

我有两个线程显示变色 SDL 窗口。它编译并运行良好,但我无法通过单击窗口的关闭按钮来关闭它们。

这是我的代码:-

#include <iostream>
#include <SDL2/SDL.h>
#include <thread>

using namespace std;

void th(string name,int x,int y,int w,int h,Uint32 flags)
{
    int i=0,o=0,p=0;
    SDL_Window *win;
    SDL_Event e;

    win = SDL_CreateWindow(name.c_str(),x,y,w,h,flags);
    SDL_ShowWindow(win);
    SDL_Surface *win_sur = SDL_GetWindowSurface(win);

    SDL_FillRect(win_sur,0,SDL_MapRGB(win_sur->format,i,o,p));
    SDL_UpdateWindowSurface(win);

    while(1)
    {
        while(SDL_PollEvent(&e))
        {
            if(e.type == SDL_QUIT)
                goto end;
        }
        SDL_FillRect(win_sur,0,SDL_MapRGB(win_sur->format,i,o,p));
        SDL_UpdateWindowSurface(win);
        i++;o+=2;p+=3;

        SDL_Delay(10);
    }
    end:
    SDL_DestroyWindow(win);
}

int main()
{
    int lk =0;
    SDL_Init(SDL_INIT_VIDEO);
    thread t1(th,"win1",90,100,500,500,SDL_WINDOW_OPENGL);
    thread t2(th,"win2",10,400,500,500,SDL_WINDOW_OPENGL);

    t1.join();
    t2.join();

    SDL_Quit();
}

我正在使用 gcc 7.3 和 Linux

【问题讨论】:

  • 存在数据竞争:两个线程将尝试在不同步的情况下读取和写入e 全局变量。与其他变量相同。而且你永远不会打电话给SDL_DestroyWindow 来摆脱窗户。
  • @VTT 我已经编辑了代码,但仍然无法工作。
  • 你也应该处理SDL_WINDOWEVENT_CLOSE事件。

标签: c++ multithreading sdl-2


【解决方案1】:

来自the docs

你只能在设置视频模式的线程中调用这个函数

在您的情况下,由于您在主线程中调用SDL_Init(SDL_INIT_VIDEO),因此您也只能在那里调用SDL_PollEvent。它可能永远不会在您的其他线程中返回任何内容。

另外,SDL_QUIT 会在用户单击最后一个 现有窗口的关闭按钮时生成。当您有多个窗口时,请查看SDL_WINDOWEVENT_CLOSE(甚至默认情况下,这可能是更好的选择)。

【讨论】:

  • 我也从线程调用SDL_Init(SDL_INIT_VIDEO)。但什么也没发生。
  • 好吧,除非我是盲人,否则您的问题中没有显示。我怀疑您是否可以两次致电SDL_Init(或者更确切地说,这是否有意义)。而且即使你使用SDL_InitSubSystem,我很确定你只能有一个事件队列,所以你想做的事情不会奏效。
  • 对不起,我在我的机器上编辑了它。感谢您的帮助☺????
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多