#include "SDL/SDL.h" #include "SDL/SDL_image.h" #include "SDL/SDL_thread.h" #include <string>
首先,我们必须记得去包含SDL线程的头文件。
//将要被使用的线程 SDL_Thread *thread = NULL; //退出标识 bool quit = false;
这里是两个重要的全局变量。
首先我们有SDL_Thread,它是我们将要运行的线程。然后我们有"quit"变量,它通常用来作为
首先我们有SDL_Thread,它是我们将要运行的线程。然后我们有"quit"变量,它通常用来作为
main()函数的局部变量,但这次我们需要它作为全局变量。
int my_thread( void *data )
{
//当程序还未结束
while( quit == false )
{
//运行标题动画
SDL_WM_SetCaption( "Thread is running", NULL );
SDL_Delay( 250 );
SDL_WM_SetCaption( "Thread is running.", NULL );
SDL_Delay( 250 );
SDL_WM_SetCaption( "Thread is running..", NULL );
SDL_Delay( 250 );
SDL_WM_SetCaption( "Thread is running...", NULL );
SDL_Delay( 250 );
}
return 0;
}
这里是将要作为我们的线程的函数。它所做的事情是当用户没有退出时,每1/4秒设置一个不同的窗口标题。现在你可以看到为何"quit"变量需要设为全局的了。
为了让一个函数能在SDL中当作一个线程来使用,它必须满足2个条件。首先是它必须返回一个整数(int)。第二,它必须有一个指向void类型数据的指针作为参数。如果这两个条件没有全部满足,这个函数就不能被用作线程。
为了让一个函数能在SDL中当作一个线程来使用,它必须满足2个条件。首先是它必须返回一个整数(int)。第二,它必须有一个指向void类型数据的指针作为参数。如果这两个条件没有全部满足,这个函数就不能被用作线程。
//创建并运行线程
thread = SDL_CreateThread( my_thread, NULL );
在main函数里,在所有东西都初始化并加载好后,我们调用
SDL_CreateThread()。
SDL_CreateThread()将函数作为第一个参数,将它变成一个线程,然后运行这个新创建的线程。它返回一个指向这个线程的指针,所以我们可以跟踪这个线程。
//将图像应用到屏幕上
apply_surface( 0, 0, image, screen );
//更新屏幕
if( SDL_Flip( screen ) == -1 )
{
return 1;
}
//当用户还未退出
while( quit == false )
{
//当有事件需要处理
while( SDL_PollEvent( &event ) )
{
//如果用户叉掉了窗口
if( event.type == SDL_QUIT )
{
//退出程序
quit = true;
}
}
}
然后我们在屏幕上显示图像,接着等待用户退出。
当这个运行着的时候,窗口标题在我们的线程中进行变化,并且这个线程与我们当前正在运行的任务是平行地运行的。多亏了SDL的多线程能力,你可以同时做这两件事了。
当这个运行着的时候,窗口标题在我们的线程中进行变化,并且这个线程与我们当前正在运行的任务是平行地运行的。多亏了SDL的多线程能力,你可以同时做这两件事了。
void clean_up()
{
//停止线程
SDL_KillThread( thread );
//释放表面
SDL_FreeSurface( image );
//退出SDL
SDL_Quit();
}
这是我们的清理函数。
首先我们调用
首先我们调用
SDL_KillThread()立即停止线程。一般你应该等待线程完成,但在这种情况下,立即停止并不会有什么损害。然后我们释放表面并退出SDL。
当提到在游戏中使用多线程时,一般的规则是"不"。相比单线程程序,你有大量更多的事情需要处理。随着多核CPU的兴起,人们会忍不住投身于这个领域的开发。
但是,多线程在游戏中的某些地方还是很有用的。如果你是游戏开发的新手,不要使用多线程,除非当你变得更有经验了。多线程相对其价值来说,可能更是个令人头疼的问题。你必须了解线程同步(这是下面两课将要讲的内容)和处理并发。只有当你对软件架构有好的把握时,你才可以使用这个强大的工具。
但是,多线程在游戏中的某些地方还是很有用的。如果你是游戏开发的新手,不要使用多线程,除非当你变得更有经验了。多线程相对其价值来说,可能更是个令人头疼的问题。你必须了解线程同步(这是下面两课将要讲的内容)和处理并发。只有当你对软件架构有好的把握时,你才可以使用这个强大的工具。