Я пишу чат-клиент в GTK. У клиента есть основной цикл GTK, плюс порожденный поток, который сидит и блокирует функцию read()
, ожидая ввода из файлового дескриптора, подключенного к сокету.
Как только функция чтения преодолевает блокировку, она имеет буфер текста, который я хотел бы добавить в виджет GTK Text View, однако он находится в потоке, который отличается от основного цикла GTK.
Как я могу наиболее быстро обновить GUI из этого другого потока? В Java я бы использовал метод SwingUtilities.invokeLater(new Runnable())
, чтобы вызвать этот метод из основного потока. Я хочу подобное поведение в C и с использованием GTK.
Вот функция, которая вызывается из нового потока ...
void* messageReceived(void* data)
{
struct ClientWindow* localVar = (struct ClientWindow*)data;
while(TRUE)
{
char buf[256];
int bytesRead = read(localVar->socketFileDescriptor, buf, 256);
GtkTextBuffer* tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(localVar->chatHistoryTextView));
GtkTextIter end;
//This code needs to execute in the main thread
gtk_text_buffer_get_end_iter(tb, &end);
gtk_text_buffer_insert(tb, &end, buf, -1);
}
}