Outils pour utilisateurs

Outils du site


allegro:threads

**Ceci est une ancienne révision du document !** ----

A PCRE internal error occured. This might be caused by a faulty plugin

===== Threads ===== Dans cet article nous allons voir comment utiliser l'interface de threading d'Allegro. FIXME faire le walktrough ==== Exemple basique ==== Comme Allegro est basé sur un système d'events, les threads sont assez peu utiles : ils servent à répartir la charge si on a plusieurs coeurs, ou à gérer le réseau si votre jeu est multijoueur. Dans cet exemple, nous allons créer un thread qui va faire avancer une barre de progression pendant que le thread principal est occupé (à charger un niveau, des images, ...). <file c main.c> #include <stdio.h> #include <allegro5/allegro.h> typedef struct s_data { ALLEGRO_MUTEX *mutex; ALLEGRO_COND *cond; ALLEGRO_DISPLAY *display; ALLEGRO_BITMAP *caret; } DATA; void init_DATA(DATA *data, ALLEGRO_DISPLAY *display, ALLEGRO_BITMAP *caret) { data->mutex = al_create_mutex(); data->cond = al_create_cond(); data->display = display; data->caret = caret; } void dest_DATA(DATA *data) { al_destroy_mutex(data->mutex); al_destroy_cond(data->cond); } const float FPS = 30; const int SCREEN_W = 640; const int SCREEN_H = 480; const int CARET_HEIGHT = 32; const int CARET_WIDTH = 16; const int PADDING = 64; static void *progressBar(ALLEGRO_THREAD *thr, void *arg); int main(int argc, char **argv) { ALLEGRO_DISPLAY *display = NULL; ALLEGRO_EVENT_QUEUE *event_queue = NULL; ALLEGRO_BITMAP *caret = NULL; ALLEGRO_THREAD *thread = NULL; DATA data; if(!al_init()) { fprintf(stderr, "failed to initialize allegro!\n"); return -1; } al_set_new_display_flags(ALLEGRO_NOFRAME | ALLEGRO_WINDOWED); display = al_create_display(SCREEN_W, SCREEN_H); if(!display) { fprintf(stderr, "failed to create display!\n"); return -1; } caret = al_create_bitmap(CARET_WIDTH, CARET_HEIGHT); if(!caret) { fprintf(stderr, "failed to create bouncer bitmap!\n"); al_destroy_display(display); return -1; } al_set_target_bitmap(caret); al_clear_to_color(al_map_rgb(255, 0, 255)); al_set_target_bitmap(al_get_backbuffer(display)); event_queue = al_create_event_queue(); if(!event_queue) { fprintf(stderr, "failed to create event_queue!\n"); al_destroy_bitmap(caret); al_destroy_display(display); return -1; } al_register_event_source(event_queue, al_get_display_event_source(display)); al_clear_to_color(al_map_rgb(0,0,0)); al_flip_display(); init_DATA(&data, display, caret); thread = al_create_thread(progressBar, &data); al_start_thread(thread); al_rest(10.0); /* Loading some awesome datas !! */ //al_set_thread_should_stop(thread); /* appelée implicitement par l'instruction ci-dessous */ al_join_thread(thread, NULL); al_destroy_thread(thread); dest_DATA(&data); al_destroy_bitmap(caret); al_destroy_display(display); al_destroy_event_queue(event_queue); return 0; } static void *progressBar(ALLEGRO_THREAD *thr, void *arg) { ALLEGRO_TIMER *timer = NULL; ALLEGRO_EVENT_QUEUE *event_queue = NULL; ALLEGRO_EVENT ev; DATA *data = (DATA*) arg; float num = 2.0; float xpos = PADDING; if (!data->display || !data->caret) { fprintf(stderr, "args are NULL!\n"); return NULL; } timer = al_create_timer(1.0 / FPS); if(!timer) { fprintf(stderr, "failed to create timer!\n"); return NULL; } event_queue = al_create_event_queue(); if(!event_queue) { fprintf(stderr, "failed to create event queue!\n"); return NULL; } al_register_event_source(event_queue, al_get_timer_event_source(timer)); al_start_timer(timer); al_set_target_bitmap(al_get_backbuffer(data->display)); /* new context */ while(!al_get_thread_should_stop(thr)) { al_wait_for_event(event_queue, &ev); // if(ev.type == ALLEGRO_EVENT_TIMER) /* ne peut être autre chose */ al_draw_bitmap(data->caret, xpos, SCREEN_H-PADDING-CARET_HEIGHT, 0); xpos += num; if (xpos >= SCREEN_W-PADDING) break; al_flip_display(); } al_destroy_timer(timer); al_destroy_event_queue(event_queue); return NULL; } </file> ==== Détails ==== [[allegro:input|Précédent]] << [[allegro:start|Sommaire]] >> [[allegro:addons|Suivant]]

allegro/threads.1331938199.txt.gz · Dernière modification: 2012/03/16 23:49 par mrhide