【问题标题】:Linux C SDL2 ThreadsLinux C SDL2 线程
【发布时间】:2020-04-27 19:16:43
【问题描述】:

我正在创建一个带有线程的 C 程序,该线程在 linux 上使用 SDL2 库。目标是让程序显示一个空白窗口并打印“Hello, world!”。每 0.5 秒发送到控制台。

到目前为止,窗口已成功创建,输入和事件处理工作正常。问题是“你好,世界!”消息只打印一次,而不是每 0.5 秒打印一次。

代码如下:

#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_thread.h>

static int thread_function(void *ptr)
{
    printf("Hello, world!\n");
    SDL_Delay(500);
    return 0;
}

void input(int *quit)
{
    SDL_Event event;
    while (SDL_PollEvent(&event)) {
        if (event.type == SDL_QUIT) {
            *quit = 1;
        }
    }
}

void render(SDL_Renderer *renderer)
{
    SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
    SDL_RenderClear(renderer);
    SDL_RenderPresent(renderer);
}

int main(int argc, char *argv[])
{
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        printf("Could not initialize SDL2! %s\n", SDL_GetError());
        return 1;
    }

    SDL_Window *window = SDL_CreateWindow(
        "Program",
        SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        400, 400, 0);
    if (window == NULL) {
        printf("Could not create window! %s\n", SDL_GetError());
        return 1;
    }

    SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0);
    if (renderer == NULL) {
        printf("Could not create renderer! %s\n", SDL_GetError());
        return 1;
    }

    SDL_Thread *thread = SDL_CreateThread(thread_function, "thread", (void *)NULL);
    if (thread == NULL) {
        printf("Could not create thread! %s\n", SDL_GetError());
        return 1;
    }

    int quit = 0;
    while (quit != 1) {
        input(&quit);
        render(renderer);
    }

    SDL_WaitThread(thread, NULL);
    SDL_DestroyWindow(window);
    SDL_DestroyRenderer(renderer);
    SDL_Quit();

    return 0;
}

我使用以下命令编译程序:

gcc -lSDL2 main.c

程序编译得很好,但行为不是我所期望和想要的。我希望线程函数与我的主循环并行连续执行。但似乎线程函数只被调用一次。

我尝试在线程函数中放置一个无限循环,但这会占用程序。我的意思是事件处理程序(输入函数)不再响应,程序最终崩溃。

我正在 debian 10.3 上编译此代码,并安装了软件包 libsdl2-dev。

我是否完全错过了如何使用线程或其他问题的要点?

【问题讨论】:

    标签: c linux multithreading debian sdl-2


    【解决方案1】:

    您的代码生成线程,该线程运行您的函数一次并退出。不会重复。

    如果您的线程没有退出条件(例如无限循环),那么在您的主循环被退出事件中断后 - 您在 SDL_WaitThread 上阻塞,因为线程永远不会完成。你也需要退出条件 - 例如在与主循环相同的退出条件下制作quit 全局变量和旋转线程循环(还有其他方法,例如使用信号量发出信号,但基本思想保持不变)。

    但是,生成多个线程只是偶尔做一些工作(这里不涉及线程同步 - 这是一个单独的主题)并且大部分时间都在休眠,这可能不是使用系统资源的最佳想法。 SDL 为您提供timers,它将在指定的时间间隔重复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多