Linux C Темы SDL2 - PullRequest
       46

Linux C Темы SDL2

0 голосов
/ 27 апреля 2020

Я создаю C программу с потоками, которая использует библиотеку SDL2 в linux. Цель состоит в том, чтобы иметь программу, которая показывает пустое окно и печатает «Привет, мир!» на консоль каждые 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

программа компилируется просто отлично, но поведение не то, что я ожидаю и хочу. Я ожидаю, что функция потока будет выполняться непрерывно параллельно с моим основным l oop. Но похоже, что функция потока вызывается только один раз.

Я пытался поместить бесконечное число l oop в функцию потока, но это приводит к перегружению программы. Под этим я подразумеваю, что обработчик событий (функция ввода) больше не реагирует и программа в конечном итоге падает.

Я скомпилировал этот код в Debian 10.3 с установленным пакетом libsdl2-dev.

Я полностью упускаю смысл в том, как использовать темы или что-то еще не так?

1 Ответ

0 голосов
/ 28 апреля 2020

Ваш код порождает поток, который запускает вашу функцию один раз и завершается. Это не будет повторяться.

Если у вашего потока нет условий выхода (например, бесконечный l oop), то после того, как ваш основной l oop будет прерван событием quit - вы блокируете на SDL_WaitThread, потому что поток никогда не завершается , Там тоже нужно условие выхода - например, сделать quit глобальную переменную и вращающуюся нить l oop в том же условии выхода, что и основное l oop (есть и другие способы, такие как передача сигналов с семафорами, но основная идея c остается то же самое).

Однако, создание нескольких потоков, которые лишь иногда выполняют некоторую работу (не затрагивая здесь синхронизацию потоков - это отдельная топика c), и сон в большинстве случаев, вероятно, не лучшая идея использования системные ресурсы. SDL предоставляет вам таймеры , которые будут повторяться с указанным интервалом.

...