【发布时间】: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