Linux C SDL2线程

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

我正在使用在Linux上使用SDL2库的线程创建C程序。目的是要创建一个程序,该程序显示空白窗口并打印“ 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

该程序可以很好地编译,但是行为不是我期望和想要的。我希望线程函数与我的主循环并行执行。但是似乎线程函数仅被调用一次。

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

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

我是否完全忘记了如何使用线程或其他出问题的地方?

c linux multithreading debian sdl-2
1个回答
0
投票

您的代码产生了一次运行您的函数并退出的线程。它不会重复。

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

但是,产生多个仅偶尔执行某些工作的线程(此处不涉及线程同步化-这是一个单独的主题),并且大多数时间休眠可能不是使用系统资源的最佳方法。 SDL为您提供timers,它将以指定的时间间隔重复。

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