2010-02-03 22 views
0

je semble faire une exception générée uniquement avec un fil créé avec QtConcurrent :: runexception générée avec QtConcurrent et appelant QTime: currentTime

J'ai une classe nommée FPSengine qui a une méthode nommée FPSengine :: getData () qui est appelée par le thread principal et 3 autres threads (2 QThreads et 1 fait avec QtConcurrent :: run()). Dans FPSengine :: getData() j'appelle QTime :: currentTime(). Si j'appelle FPSengine :: getData() du thread principal ou l'un des QThreads, je n'ai aucun problème mais quand j'appelle FPSengine :: getData() du thread créé avec Qtconcurrent :: run(), j'ai parfois une exception. Peut-il y avoir un problème avec Qtconcurrent ou QTime: currentTime() ou même tzset (qui est appelé par QTime :: currentTime d'après ce que montre la pile de gdb)? Ou est-ce qu'il y a un problème avec mon code? Voici l'info pile du fil à défaut:
0 0 augmentation /lib/libc.so.6
1 0 abort /lib/libc.so.6
2 ?? /lib/libc.so.6 0
3 ?? /lib/libc.so.6 0
4 gratuit /lib/libc.so.6 0
5 ?? /lib/libc.so.6 0
6 tzset /lib/libc.so.6 0
7 QTime :: currentTime() /usr/lib/libQtCore.so.4 0
8 FPSengine :: xmitData FPSengine2 .cpp 93
9 FPSengine :: getData FPSengine2.cpp 21
10 threadDatalog :: exécutez threaddatalog.cpp 109
11 ?? /usr/lib/libQtCore.so.4 0
12 start_thread /lib/libpthread.so.0 0
13 clone /lib/libc.so.6 0 14 ?? 0

Répondre

1

QTime::currentTime() (ou l'une des fonctions QTime, vraiment) ne sont pas documentés comme étant concurrents. De plus, je doute que l'appel sous-jacent (tzset) soit conçu pour gérer très bien la concurrence. En conséquence, vous aurez probablement besoin d'ajouter une protection, comme un mutex, autour de l'appel pour obtenir l'heure actuelle afin d'empêcher l'accès simultané. Je ne sais pas si cela va résoudre votre problème, mais cela vous aidera probablement.

+0

thx, j'ai été en mesure de changer mon code pour ne plus utiliser ces appels et le problème est parti –