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

    [c & gtk] gtk, threads, processi e domandine varie

    Buonasera ragazzi, ho un esame che si avvicina drasticamente, in cui ho voluto realizzare un programma dimostrativo delle varie system call, il tutto accompagnato da un'interfaccia grafica fatta con le gtk, questa è la mia prima esperienza di programmazione in c, quindi accetto volentieri delle critiche.

    Vi spiego i problemi, la grafica è composto da un GTKTREEVIEW dove ci sono le varie funzioni selezionabili, poi ci sono 3 text view che utilizzo per visualizzare a video il codice sorgente, scrivere l'output delle funzioni, e la terza per prendere in input da tastiera.

    Alla GtkTreeView ho applicato un g_signal così che verifica quando viene cambiata la selezione e fa partire la funzione richiesta.


    con questi tre metodi gestico le textview, i metodi ovviamente sono dichiarati in un header che poi richiamo dai sorgenti delle funzioni:

    codice:
    volatile gint scritto;
    
    void add_to_view_4code(GtkWidget *textview4code , gchar *text) 
    {          
    GtkTextBuffer *buffer;
    buffer =gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview4code)); 
     gtk_text_buffer_set_text     (buffer, text, -1);
      }   
    
    void add_to_view_4write( GtkWidget *textview4write , gchar *text){    
       gdk_threads_enter ();          	
       GtkTextBuffer *buffer;  
       GtkTextIter iter;    
       buffer =gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview4write));   
        gtk_text_buffer_get_end_iter (buffer,&iter)  ;  
        gtk_text_buffer_insert (buffer, &iter, text, -1);  
        gdk_threads_leave ();
     }     
    
    
         gchar  *read_from_view (GtkWidget *textview4read ){    
    	
    scritto=FALSE;   
    while (!scritto) 
    	sleep(1); 	       
    
       gdk_threads_enter ();      
      
       GtkTextBuffer *buffer;           
      GtkTextIter start_iter;        
      GtkTextIter end_iter; 
              
       buffer =gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview4read));          
        gtk_text_buffer_get_end_iter (buffer,&end_iter)  ;
       gtk_text_buffer_get_start_iter (buffer,&start_iter)  ; 
       gchar *read;   	
    read=gtk_text_buffer_get_text (buffer, &start_iter, &end_iter, TRUE);       
      gtk_text_buffer_set_text (buffer, "", -1); 
    	 
       gdk_threads_leave ();    
    	
    return g_strconcat(read, "\n", NULL);       }







    questo metodo invece è collegato alla view per leggere da tastiera:

    codice:
    static gint key_press(GtkWidget *textview4read, GdkEventKey *event)  
    {  	         
    GtkTextBuffer *buffer; 
              
    GtkTextIter end_iter;     
    
    buffer =gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview4read));      
    
    gtk_text_buffer_get_end_iter (buffer,&end_iter)  ; 
    
       if(event->keyval == 65293 ){    	
    	g_print("tasto INVIO trovato!!!!\n");       
            scritto=TRUE;   } 	
    
      else       gtk_text_buffer_insert (buffer, &end_iter, event->string, 1); //per questo sono quasi sempre tenuto ad aggiungere un solo carattere 	     }

    e fin qui tutto funziona, purtroppo io chiamo le funzioni (le quali non sono su un' altro sorgente) e per non far bloccare la grafica le chiamo come threads e gli passo una una struttura che dichiaro come tipo nell'header structure.h, ad esempio:

    struttura nell'header:

    typedef struct
    {
    GtkWidget *codeview;
    GtkWidget *viewWrite;
    GtkWidget *viewRead;
    GtkWidget *tree;
    } threads_args;






    #include <sys/types.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <gtk/gtk.h>
    #include "structure.h"
    #include "mioheader.h"

    int forkf(void *args) {

    gchar *msg;
    threads_args *data = (threads_args *)args;

    GtkWidget *viewWrite = data->viewWrite;
    pid_t pid;
    msg="Ciao io sono un processo, ora creo un figlio\n";
    add_to_view_4write (viewWrite, msg );
    sleep(2);

    //Creo un filgio e controllo che non ci siano errori
    if ( (pid = fork()) < 0)
    perror("Errore fork");

    else if (pid == 0) {
    //figlio
    msg="pen";
    //msg="Ciao io sono il figlio, vi elenco i miei dati:\n pid = %d, parent pid = %d, uid = %d, gid = %d \n", getpid(), //getppid(), getuid(),getgid();

    add_to_view_4write (viewWrite, msg);
    }

    else{ //padre

    sleep(2);

    msg= g_strconcat("Io sono il padre di " , "ca" , NULL);
    //msg= ("Io sono il padre di %d, vi elenco i miei dati:\n pid = %d, parent pid = %d, uid = %d, gid = %d \n",pid, getpid(), //getppid(), getuid(),getgid());

    add_to_view_4write (viewWrite, msg);
    }

    del mio codice funziona tutto, tranne quando crea un processo figlio, il metodo add_to_view_4write viene chiamato però non fa niente, speravo che facendo una fork, il processo figlio "ereditava" tutti i puntatori, invece non sembrerebbe...

    Che ne pensate?

    Inoltre inizio a pensare che sia meglio g_lockare la variabile volatile che utilizzo per sapere quando l'utente preme invio confermando il messaggio che ha scritto.

    come potete vedere nell'ultimo codice c'è una stringa commentata:

    //msg= ("Io sono il padre di %d, vi elenco i miei dati:\n pid = %d, parent pid = %d, uid = %d, gid = %d \n",pid, getpid(), //getppid(), getuid(),getgid());

    in precedenza questa era un printf e ovviamente funzionava, sembrera banale ma non riesco a fare un cast funzionante di tutti i pid, getpid eccetera per passare la stringa al metodo add_to_view_4write..

    So che sembra un casino, però il tempo stringe veramente e non so più che fare!!!
    Spero di essere stato chiaro su tutto, altrimenti non esitate a chiedere.

    Grazie in anticipo a tutti.

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Prova a cercare qui Widgets and g_Threads:, forse si creano delle situazioni di deadlock.
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    se ho capito bene questa frase no:

    You will create a deadlock condition if you try to update a widget before it has been realized.


    io prima creo e inizializzo i widgets, e poi do la possibilità di far partire i thread.

  4. #4
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Ha cmq letto dv io nn dicevo, prova qui, forse trovi qualcosa di + significativo su threads e X Server.
    Per gli Spartani e Sparta usa spartan Il mio github

  5. #5
    Ho provato a tirare fuori qualche cosa di utile per me da quella pagina ma niente, ho fatto ogni prova possibile, controllato che il puntatore del padre sia uguale a quello del figlio ed è uguale, però continuo a pensare che il problema sia qui, quando faccio la fork. ho provato anche a lavorare con i puntatori ai buffer invece che quelli alle textview e poi estrarre il buffer ma niente. Non ho proprio idee!!!!

    Vi prego help!!

  6. #6
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Credo che il tuo prblema siano i processi, prova qui allora.
    Per gli Spartani e Sparta usa spartan Il mio github

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 © 2024 vBulletin Solutions, Inc. All rights reserved.