Здесь вам нужно ответить на две части: одна - как обмениваться данными между двумя процессами (ваш графический интерфейс и процесс, выполняющий функцию), а другая - как изменить вашу функцию, чтобы она отвечала на асинхронные запросы ( «о, мне сказали просто вернуть все, что у меня есть»).
Разработка ответа на второй вопрос, вероятно, продиктует ответ на первый. Вы можете сделать это с помощью сигналов (в этом случае вы получите обработчик сигнала, который получает контроль над процессом, может искать более подробные инструкции в другом месте и изменить свои внутренние структуры данных, прежде чем вернуть управление своей функции), или у вас может быть ваша функция отслеживать интерфейс управления для команд (каждую миллисекунду проверять, есть ли ожидающая команда, и если есть, посмотреть, что это такое).
В первом случае вам понадобится обработка сигналов ANSI C (signal (), sighandler_t), во втором - канал или аналогичный (pipe () и select ()).