Автор заблокировал тему (видимо раздражен ответами), поэтому прошу простить мою навязчивость
Причем запускает он её не простым стартом QThread, а снятием ранее запущенной нити, которая к этому времени находится в WaitCondition. То есть, основной процесс-приемник сигнала делает wakeOne() для ожидающей нити, после того, как разобрал данные и подготовил для обработки. И сразу, как только он разбудил обработчик, основной процесс приостанавливается на своём WaitCondition (иначе он начинает ловить следующие входящие сигналы, и начинается чехарда при подготовке данных, которые никто не успевает обработать). Когда обработка закончена, 3я нить снимает основной процесс с ожидания вызовом wakeOne() сама снова становится в WaitCondition, и приём повторяется
Возможно это типичная ошибка "wakeOne будит нитку". Это не совсем так, побудка не имеет эффекта если нет нити(ей) ожидающих на WaitCondition, и проблема в том что Вы никак не можете узнать сидит она на wait или нет. Поэтому ожидающая нитка должна сама страховаться, напр
C++ (Qt)
while (true) {
mutex.lock();
while (data.size() == 0)
condition.wait(&mutex);
// do something
mutex.unlock();
}
Напр нитка делает mutex.lock() (вторая строчка), но получилось так что кто-то другой захватил мутекс и сделал wakeOne - который никого не разбудил. Тогда нитка проверила что уже есть данные в data (вот страховка) и не стала никого ждать.
Эта схема часто применяется для выборки из очереди, т.е. когда кладут и изымают из одного контейнера. Если такой необходимости нет, то на QSemaphore получается проще и приятнее