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