我正在使用在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上编译此代码。
我是否完全忘记了如何使用线程或其他出问题的地方?
您的代码产生了一次运行您的函数并退出的线程。它不会重复。
[如果您的线程没有退出条件(例如,无限循环),那么在您的主循环被quit事件中断后-您阻塞SDL_WaitThread
,因为线程永远不会结束。您也需要那里的退出条件-例如在与主循环相同的退出条件下制作quit
全局变量和旋转线程循环(还有其他方法,如使用信号量进行信号发送,但基本思路保持不变)。
但是,产生多个仅偶尔执行某些工作的线程(此处不涉及线程同步化-这是一个单独的主题),并且大多数时间休眠可能不是使用系统资源的最佳方法。 SDL为您提供timers,它将以指定的时间间隔重复。