Bonjour à toutes et à tous !
Je suis débutant en C++ (bien qu'étant déjà passé par le C
) et je suis sur un projet de programme permettant d'enregistrer de la vidéo depuis une webcam. Je suis sous Ubuntu Gnu/Linux et j'utilise pour ce faire, la librairie V4L pour accéder à mon préiphérique. J'ai suivis plusieurs tutos pour arriver où j'en suis actuellement, c'est à dire l'affichage de l'image récupérée de la webcam dans un gtk_drawing_area.
Seulement, et c'est là que ça se complique, je dois accéder à ce composant depuis une fonction d'une classe appelée depuis la création d'un thread dans mon fichier principal :
pthread_create (&CaptureThreadID, NULL, CaptureThreadLoop, NULL);
1 2 3
| void * CaptureThreadLoop(void *) {
Camera.startRecord("", p_VideoWindow);
} |
Camera est une instance de cette classe. Et p_VideoWindow est le gtk_drawing_area que j'envoie comme paramètre pour que la fonction de la classe puisse dessiner à l'intérieur.
Le problème est que visiblement, gtk n'autorise pas cette manipulation... J'ai lancé le programme avec gdb (le débugger) et il me retourne ceci :

Envoyé par
GDB
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1222644848 (LWP 7879)]
0xb7c0d1e0 in ?? () from /usr/lib/libgdk-x11-2.0.so.0
J'en ai donc déduis qu'il était interdit d'accéder à des éléments de l'interface graphique (dans leur propre thread) depuis un autre thread.
Ma question est la suivante : ai-je raison, et comment puis-je corriger celà ?
Merci d'avance, j'attends avec impatience vos réponses, même si c'est pour corriger une grosse faute de bleu que je suis suceptible d'avoir comis...
PS : j'ai également tenté d'implémenter une fonction faisant la même chose que la portion de code de la classe servant à afficher l'image, dans mon main.cpp mais je ne sais pas comment accéder à cette fonction depuis la classe. Cependant, faire ce genre de chose serait une aberration car une classe doit pouvoir fonctionner dans tous les programmes sans qu'elle doive appeler une fonction précise dudit programme...
Partager