2010-09-06 6 views
2

Je travaille sur un petit projet qui utilise DirectShow/COM pour la capture, et DShow fait des rappels en utilisant ses propres threads lorsque mon application obtient des données d'imagerie. J'utilise également Qt dans mon projet, et je veux utiliser Qt pour la synchronisation et la sécurité des threads. Je me demande comment je peux utiliser Qt Threads dans ce cas. Je comprends que je peux également utiliser les fonctions CriticalSection de Win32, mais cela rendrait plus difficile le portage de mon code sur d'autres plateformes (le matériel DShow étant le seul code spécifique à Windows dans mon projet).Mélange de threads Qt avec des threads COM

Ma question est: "comment utiliser les fonctions de sécurité de thread de Qt lorsque je travaille avec des threads non-Qt?"

Répondre

2

(non-responsabilité:.. Ai pas utilisé moi-même Threads QT - Mais je recoupé les sources de mon QtCreator ici)

de regarder http://doc.qt.nokia.com/4.6/threads.html#the-threading-classes et de mon expérience avec d'autres libs de filetage, je dirais que vous avez probablement peut utiliser en toute sécurité toutes les constructions de threads (QMutex, QMutexLocker, ... mais aussi QFuture, ...) qui ne dépendent pas de l'existence d'un objet QThread pour le thread sur lequel ils "fonctionnent". C'est, utilisez en toute sécurité à partir de l'un de vos threads COM. Sur le comment: La classe QMutex sera utilisée exactement de la même manière, peu importe si vous avez lancé un thread via QThread ou s'il s'agit d'un thread COM. En effet, il doit utiliser directement le support du thread sous-jacent du système d'exploitation et n'a pas vraiment besoin d'un thread créé via un objet QThread. Puisque vous parlez des sections critiques: Qt "seulement" semble implémenter une classe QMutex générique. En ce qui concerne la fonctionnalité, je pense que c'est à peu près correct. Dans une application fortement multithread il peut (peut!) Payer pour utiliser win32 CriticalSections directement (via un wrapper mince avec une interface de type QMutex) pour des raisons de performances.