Как сделать неблокирующий поток или как вызвать функцию на си и не ждать ее выполнения, а получить данные тогда, когда основная программа будет к этому морально готова?
Для начала стоит сформулировать, что подразумевается под "когда основная программа будет морально готова". А если данные не будут готовы к этому моменту?
Примитивный вариант - иметь какое-то синхронизированное расшаренное хранилище, в котором будут данные и флажок готовности данных. Остальное - вопрос красивых оберток