@gibbonchik

Как в Си из стороннего потока вызвать метод, который должен выполняться из основного потока?

Доброго времени суток, друзья!
Я пишу плагин для Pidgin. В нем я создаю сторонний поток, там слушаю порт и при получении команды отправляю сообщение пользователю. Так вот для того чтобы отправить сообщение нужно создать создать
PurpleConversation *conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acc, buddy);

но purple_conversation_new при выполнении из стороннего потока крэшит пиджин. Из основного потока все нормально. Эта строка создает диалоговое окно с пользователем. Вдальнейшем сообщение пользователю передается так:
PurpleAccount *acc = FindNeededAccount(buddy);
if(acc == NULL) {
	printf("acc == NULL");
	return;
}
PurpleConversation *conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acc, buddy); 
purple_conv_im_send(PURPLE_CONV_IM(conv), message);


Я обычно пишу на C++ и там есть TThread и std::thread, которые позволяют выполнять функции в синхронизации с основным потоком. Подскажите как это можно сделать в чистом Си?
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
tsarevfs
@tsarevfs
C++ developer
В треде, который слушает порт, полученные данные кладем в очередь (не забывая про блокировки). В главном треде проверяем очередь (опять же, с блокировкой) и если пришло что-то новое вызываем нужную функцию. Скорее всего в главном потоке крутится eventloop самого libpurple, поэтому проверять придется например по таймеру.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы