GTK kullanarak oldukça basit bir C application yapıyorum, ancak GUI güncellemelerini tetikleyecek bazı engelleme IO'ları gerçekleştirmeliyim. Bunu yapmak için, ben gibi gtk_main()
önce yeni pthread
hakkını başlatın:GTK ile sorun giderme sorunları
g_main_context_invoke(mainc, set_icon, param);
Nerede set_icon
pthread
bazı verileri okuduğunda
/* global variables */
GMainContext *mainc;
/* local variables */
FILE *fifo;
pthread_t reader;
/* main() */
mainc = g_main_context_default();
pthread_create(&reader, NULL, watch_fifo, argv[argc-1]);
gtk_main();
, GUI şöyle günceller
gboolean set_icon(gpointer data)
{
char *p = (char*)data;
gtk_status_icon_set_from_icon_name(icon, p);
return FALSE;
}
Bu, çoğu zaman çalışır, ancak her seferinde bu ilginç hata iletisini alıyorum:
[xcb] Unknown sequence number while processing queue [xcb] Most likely this is a multi-threaded client and XInitThreads has not been called [xcb] Aborting, sorry about that. mktrayicon: xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.
g_main_context_invoke
'u kullanmanın tüm noktası, iş parçacıklarıyla ilgili sorunları önlemek olduğunu düşündüm? Biraz Googling yaparak, gdk_threads_init
, gdk_threads_enter
ve arkadaşlarına rastladım, ancak bunların hepsi kullanımdan kaldırıldı mı? GTK belgelerinin, tüm GUI güncellemelerinin ana iş parçacığı üzerinde gerçekleştirilmesi gerektiğini söylediğini biliyorum, ancak bu, IO'yu bloke etmekle bütün bunları iyi bir şekilde birleştirmiyor ve iş parçacıkları arasında bazı karmaşık iletişim mekanizmalarını oluşturmamayı tercih ediyorum.
Ve benim sorum şu, bununla nasıl başa çıkmalıyım?
DÜZENLEME: Tam kod EDIT2 here görülebilir: @ ptomato en yanıta göre bir güncelleme, ben GThread
s taşındı ve taahhüt this görülen, ancak sorun hala mevcut olduğu gibi gdk_threads_add_idle()
kullanarak ettiğimiz gibi.
Biraz kodunuz var mı, oldukça uzun bir süredir gtk + kullanıyorum ve _never_ bu konuda tökezledim .. – drahnr
Tüm kod [GitHub] adresinde bulabilirsiniz (https://github.com/jonhoo/mktrayicon) gönderiye bağlı olarak. –
Ah, teşekkür etti! – drahnr