]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - tests/gtkmm/threads/threads.cc
Empiezo a darle forma el directorio del proyecto cliente y genero algo de codigo
[z.facultad/75.42/plaqui.git] / tests / gtkmm / threads / threads.cc
1 /*
2  * Ejemplo de threads con la glibmm.
3  *
4  * Para compilar:
5  * g++ -Wall `pkg-config --cflags --libs glibmm-2.0 gthread-2.0` -o threads threads.cc
6  *
7  */
8
9 #include <cstdlib>
10 #include <glibmm/thread.h>
11 #include <iostream>
12
13 void ejecuta_animal(const char* yo)
14 {
15         int cuento = 500 + rand()%500;
16
17         std::cout << yo << ": voy contar hasta " << cuento << std::endl;
18         // Yieldea para que primero imprima todas las "cabeceras".
19         Glib::Thread::yield();
20
21         for (int i = 0; i <= cuento; i++) {
22                 // Si es multiplo de 100, imprimo.
23                 if (!(i % 100)) {
24                         std::cout << "  " << yo << ": voy por " << i << " de "
25                                 << cuento << std::endl;
26                 }
27                 // Deja que se schedulee otro thread...
28                 // XXX - La doc recomiendo no usar esta funcion, pero la pongo
29                 // pa' probar nomas :)
30                 Glib::Thread::yield();
31         }
32 }
33
34 int main(int argc, char *argv[])
35 {
36         // Pone semilla para random.
37         srand(time(0));
38         // Inicializa "sistema de threads".
39         Glib::thread_init();
40         // Crea un thread., por defecto no toma argumentos el thread, por lo
41         // que con SigC::bind() le "agrego" un argumento (de tipo const char*)
42         // adicional a la llamada.
43         Glib::Thread* thread1 = Glib::Thread::create(
44                         SigC::bind<const char*>(
45                                 SigC::slot(&ejecuta_animal),
46                                 "GNU"),
47                         0, // Stack por defecto.
48                         true, // Es 'joinable'.
49                         true, // Se 'schedulea' a nivel de proceso (en linux siempre es asi)
50                         Glib::THREAD_PRIORITY_LOW);
51         Glib::Thread* thread2 = Glib::Thread::create(
52                         SigC::bind<const char*>(
53                                 SigC::slot(&ejecuta_animal),
54                                 "Vaca"),
55                         0, // Stack por defecto.
56                         true, // Es 'joinable'.
57                         true, // Se 'schedulea' a nivel de proceso (en linux siempre es asi)
58                         Glib::THREAD_PRIORITY_LOW);
59         // Se crea con todo por default (incluso la prioridad).
60         Glib::Thread* thread3 = Glib::Thread::create(
61                         SigC::bind<const char*>(
62                                 SigC::slot(&ejecuta_animal),
63                                 "Conejo"),
64                         true);
65         // Espera a que terminen todods.
66         thread1->join();
67         thread2->join();
68         thread3->join();
69         return 0;
70 }
71