многопоточность — зацикливание Eventloop: пример NAO C ++ SDK OnFaceDetection

Я установил NAOqi C ++ SDK на свой MAC и попробовал некоторые примеры из SDK. HelloWorld-Example работал нормально, но с OnFaceDetection-пример Я получу Ошибка / Предупреждение с qi.eventloop после того, как НАО обнаружит мое лицо.

Narongsones-MacBook-Pro:bin Narongsone$ ./onfacedetection --pip 192.168.1.138
[I] 1295 core.common.toolsmain: ..::: starting onfacedetection :::..

[I] 1295 core.common.toolsmain: Connecting to 192.168.1.138:9559...

[I] 1295 qimessaging.session: Session listener created on tcp://0.0.0.0:0
[I] 1295 qimessaging.transportserver: TransportServer will listen on:    tcp://192.168.1.136:64881
[I] 1295 qimessaging.transportserver: TransportServer will listen on: tcp://127.0.0.1:64881
[I] 1295 core.common.toolsmain: Connection with 192.168.1.138:9559 established

[I] 1295 module.example: No face detected

[I] 1295 core.common.toolsmain: onfacedetection is ready... Press CTRL^C to quit

[I] 3843 module.name: 1 face(s) detected.

[I] 4355 qi.eventloop: eventloop: создание дополнительных тем (5)

[I] 4355 qi.eventloop: eventloop: создание новых тем (6)

[I] 4355 qi.eventloop: eventloop: создание новых тем (7)

[I] 4355 qi.eventloop: eventloop: создание новых тем (8)

[I] 4355 qi.eventloop: eventloop: создание дополнительных тем (9)

[I] 4355 qi.eventloop: eventloop: создание дополнительных тем (10)

Пожалуйста, помогите мне, если у вас есть представление о том, в чем проблема. Спасибо!

Моя функция обратного вызова:

void OnFaceDetection::callback() {
/** Use a mutex to make it all thread safe. */
AL::ALCriticalSection section(fCallbackMutex);

try {
/** Retrieve the data raised by the event. */
fFaces = fMemoryProxy.getData("FaceDetected");
/** Check that there are faces effectively detected. */
if (fFaces.getSize() < 2 ) {
if (fFacesCount != 0) {
qiLogInfo("module.example") << "No face detected" << std::endl;
fTtsProxy.say("No face detected.");
fFacesCount = 0;
}
return;
}
/** Check the number of faces from the FaceInfo field, and check that it has
* changed from the last event.*/
if (fFaces[1].getSize() - 1 != fFacesCount) {
qiLogInfo("module.name") << fFaces[1].getSize() - 1 << " face(s) detected." << std::endl;
char buffer[50];

sprintf(buffer, "%d faces detected.", fFaces[1].getSize() - 1);
fTtsProxy.say(std::string(buffer));

/** Update the current number of detected faces. */
fFacesCount = fFaces[1].getSize() - 1;
}

}
catch (const AL::ALError& e) {
qiLogError("module.name") << e.what() << std::endl;
}
}

0

Решение

Как упомянул @AlexandreMazel, эта ошибка просто объясняет вам, что система создает слишком много новых потоков, так как функция вызывается очень часто (до 10x / s), но для ее выполнения требуется несколько секунд, поскольку в ней есть речь.

Вы можете захотеть иметь флаг или неблокирующий мьютекс, чтобы предотвратить запуск функции несколько раз.

0

Другие решения

Об изменении tts.say, вот пример:

изменить tts.say методом, обрабатывающим все текстовые команды

tts.say(txt)

будет выглядеть так:

if time.time() - self.lastSaidTime > 5.0 or txt != self.lastSaidText:
self.lastSaidTime = time.time()
self.lastSaidText = txt
tts.say(txt)
0

По вопросам рекламы [email protected]