Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    GTK e software multithread

    ciao

    sto facendo un software multithread in ambiente unix, in c e con gtk per la grafica.

    il software ha diversi thread in esecuzione, diciamo 3/4 e tutti vanno ad aggiornare graficamente diversi componenti di una finestra, (frame, bottoni, ecc ecc)

    ho aggiunto da poco una funzione, che si occupa di gestire il logging delle informazioni in una textarea

    codice:
    void log_window(char *mex,int mex_log_level, ...){
      
      /*
        qui andrà messo il controllo sul livello di logging
      */
      if(mex_log_level<=log_level){
    
        //per evitare problemi metto un semaforo per l'accesso a questa risorsa
        sem_wait(&sem_logging);
    
        va_list ap;
        int d;
        char c, *p, *s;
        
        va_start(ap, mex);
        while (*mex)
          switch(*mex++) {
          case 's':           /* string */
    	s = va_arg(ap, char *);
    	gtk_text_insert(textarea_log, NULL, NULL,NULL, s, -1);
    	break;
          case 'd':           /* int */
    	d = va_arg(ap, int);
    	char str[33];
    	sprintf(str,"%d",d);
    	gtk_text_insert(textarea_log, NULL, NULL,NULL, str, -1);
    	break;
          case 'c':           /* char */
    	/* need a cast here since va_arg only
    	   takes fully promoted types */
    	c = (char) va_arg(ap, int);
    	printf("char %c\n", c);
    	break;
          }
      va_end(ap);
      
      //libero la risorsa
      sem_post(&sem_logging);
      
      }else{
        return ;
      }
      
    }
    il problema è che dopo alcuni messaggi di logging ottengo questo errore, e l'applicazione si blocca:

    codice:
    Xlib: unexpected async reply (sequence 0x839)!
    :-( secondo voi, cosa posso fare ? temo che, nonostante io abbia messu un semaforo nella funzione, questo semaforo non tenga conto di quando il main loop delle gtk va a lavorare sulla textarea... o sbaglio?

    grazie
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  2. #2
    l'applicazione main deve essere strutturata in questo modo

    codice:
    int
    main (int argc, char *argv[])
    {
      GtkWidget *window;
    
      /* init threads */	
      g_thread_init(NULL);
      gdk_threads_init();
      
      /* init gtk */
      gtk_init(&argc, &argv);
    
      window = create_window();
      gtk_widget_show(window);
    
      gdk_threads_enter();
      gtk_main();
      gdk_threads_leave();
    
      return 0;
    }

    prima e dopo aver chiamato (da parte di thread) eventi che modificano qualche evento delle GTK

    codice:
      gdk_threads_enter();
    /*evento che modifica le GTK*/
      gdk_threads_leave();
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.