Advertisement
daniele2013

threadinc callback C

Aug 17th, 2015
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.03 KB | None | 0 0
  1. // MAIN.C
  2.  
  3. #include "lista.h"
  4.  
  5. int main()
  6. {
  7.     Testa t = create(10,OnDimensionChangedCallback, OnSwitchActivatedCallback, ActionCallback);
  8.     do{
  9.         menu(t);
  10.         sleep(2);
  11.         system("clear");
  12.     }while(1);
  13.     return 0;
  14. }
  15.  
  16. // LISTA.C
  17.  
  18. #include "lista.h"
  19.  
  20. pthread_t tf_1;
  21. pthread_t tf_2;
  22. pthread_t tf_3;
  23.  
  24. int sec;
  25.  
  26. Testa create(int dim, onDimensionChangedCallback evt1, onSwitchActivatedCallback evt2, onActionCallback evt3){
  27.     Testa t = (Testa)malloc(sizeof(testa));
  28.     t->dim = t->eff_dim = dim;
  29.     t->l = build(dim);
  30.     t->on = 0;
  31.     time_t rtime;
  32.     time(&rtime);
  33.     struct tm * timeinfo = localtime(&rtime);
  34.     sec = timeinfo->tm_sec;
  35.     pthread_create(&tf_1,NULL, evt1, (void *)t);
  36.     pthread_create(&tf_2,NULL, evt2, (void *)t);
  37.     pthread_create(&tf_3,NULL, evt3, (void *)t);
  38.     return t;
  39. }
  40.  
  41. Lista build(int dim){
  42.     int i;
  43.     Lista head = NULL;
  44.     for(i = 0; i < dim; i++)
  45.         head = addhead(head,i);
  46.     return head;
  47. }
  48.  
  49. Lista addhead(Lista head, int i){
  50.     Lista tail = (Lista)malloc(sizeof(lista));
  51.     tail->x = i;
  52.     tail->next = head;
  53.     return tail;
  54. }
  55.  
  56. void *onDimensionChanged(void *arg){
  57.     Testa t = (Testa)arg;
  58.     if(t->dim != t->eff_dim){
  59.         puts("cambio dimensione!");
  60.         t->dim = t->eff_dim;
  61.     }
  62.     return arg;
  63. }
  64.  
  65. void *onActionPerformed(void *arg){
  66.     Testa t = (Testa)arg;
  67.     char *n;
  68.     time_t rtime;
  69.     time(&rtime);
  70.     struct tm * timeinfo = localtime(&rtime);
  71.     if((timeinfo->tm_sec - sec) >= 5){
  72.         puts("[ STANDBY - premi Y per continuare... ]");
  73.         timeinfo = localtime(&rtime);
  74.         sec = timeinfo->tm_sec;
  75.     }
  76.     return arg;
  77. }
  78.  
  79. void print(Testa t){
  80.     Lista l = t->l;
  81.     int n = (t->dim > t->eff_dim ? t->eff_dim : t->dim);
  82.     while(l){
  83.         printf("%d - ", l->x);
  84.         l = l->next;
  85.         n--;
  86.     }
  87.     printf("NULL\n");
  88. }
  89.  
  90. void *OnDimensionChangedCallback(void *arg){
  91.     do{
  92.         pthread_create(&tf_1,NULL,onDimensionChanged,arg);
  93.     }while(!pthread_join(tf_1,NULL));
  94.     return arg;
  95. }
  96.  
  97. void *OnSwitchActivatedCallback(void *arg){
  98.     do{
  99.         pthread_create(&tf_2,NULL,onSwitchActivated,arg);
  100.     }while(!pthread_join(tf_2,NULL));
  101.     return arg;
  102. }
  103.  
  104. void *ActionCallback(void *arg){
  105.     do{
  106.         pthread_create(&tf_2,NULL,onActionPerformed,arg);
  107.     }while(!pthread_join(tf_2,NULL));
  108.     return arg;
  109. }
  110.  
  111. void *onSwitchActivated(void *arg){
  112.     Testa t = (Testa)arg;
  113.     if(t->on == 1){
  114.         t->on = 0;
  115.         t = redim(t);
  116.     }
  117.     return arg;
  118. }
  119.  
  120. Testa redim(Testa t){
  121.     int i;
  122.     t->l = NULL;
  123.     for(i = 0; i < t->dim; i++)
  124.         t->l = addhead(t->l,i);
  125.     return t;
  126. }
  127.  
  128. void menu(Testa t){
  129.     int c;
  130.     printf("Scegli:\n1 - cambia dimensione\n2 - stampa\n3 - ripopola in base alle dimensioni nuove\n> ");
  131.     scanf("%d", &c);
  132.     switch(c){
  133.         case 1:
  134.             printf("Nuova dimensione fittizia: ");
  135.             scanf("%d", &(t->eff_dim));
  136.             break;
  137.         case 2:
  138.             print(t);
  139.             break;
  140.         case 3:
  141.             t->on = 1;
  142.             break;
  143.     }
  144. }
  145.  
  146. // LISTA.H
  147.  
  148. #ifndef _lis
  149. #define _lis
  150.  
  151. #include <stdio.h>
  152. #include <stdlib.h>
  153. #include <pthread.h>
  154. #include <time.h>
  155. #include <unistd.h>
  156.  
  157. typedef void *(*onDimensionChangedCallback)(void *);
  158. typedef void *(*onSwitchActivatedCallback)(void *);
  159. typedef void *(*onActionCallback)(void *);
  160.  
  161. typedef struct lista{
  162.     int x;
  163.     struct lista *next;
  164. } lista, *Lista;
  165.  
  166. typedef struct testa{
  167.     int dim;
  168.     int eff_dim;
  169.     int on;
  170.     Lista l;
  171. }testa, *Testa;
  172.  
  173. Testa create(int dim, onDimensionChangedCallback evt1, onSwitchActivatedCallback evt2, onActionCallback evt3);
  174. Lista build(int dim);
  175. Lista addhead(Lista head, int i);
  176. void *onDimensionChanged(void *arg);
  177. void *onSwitchActivated(void *arg);
  178. void *ActionCallback(void *arg);
  179. void print(Testa l);
  180. void *OnSwitchActivatedCallback(void *arg);
  181. void *OnDimensionChangedCallback(void *arg);
  182. Testa redim(Testa t);
  183. void menu(Testa t);
  184.  
  185. #endif // _lis
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement