Bonjour,
j'ai un probleme pour arreter l'exécution d'un thread comme je le souhaite...

J'ai une fenetre principale avec un bouton qui exécute un thread et ouvre une autre fenetre lorsqu'on clique sur un bouton. Dans cette deuxieme fenetre il y a un bouton quitter qui permet de fermer cette fenetre et qui devrait arreter l'exécution du thread.
J'ai pour cela utilisé la fonction g_thread_exit(0) dans la fonction CALLBACK du bouton.

Mon probleme est que le bouton quitter ferme toute l'application alors que je voudrais que la fenetre principale reste affichée pour éventuellement relancer le thread...

Je ne vois pas trop comment faire sans l'utilisation des thread pour que mon interface ne soit pas bloquée et que je puisse lancer et arreter ma fonction quand je le souhaite...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <stdlib.h>
#include <gtk/gtk.h>
#include <glib.h>
#include "TraitementTrame.h"
 
void lancement_app(GtkWidget *pButton, gpointer data);
int ferm_app(GtkWidget *pButton, gpointer data);
 
int main(int argc, char **argv)
{
    GtkWidget *pWindow;
    GtkWidget *pVBox;
    GtkWidget *pButton;
    gchar* titreUTF8; // Pour ranger le titre convertit
 
    gtk_init(&argc,&argv); // Initialisation de GTK
    g_thread_init(NULL);
 
    pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); // Création de la fenètre
    titreUTF8 = g_locale_to_utf8("Création du fichier XML", -1, NULL, NULL, NULL); // Conversion du titre en utf8
 
    gtk_window_set_title(GTK_WINDOW(pWindow), titreUTF8); // Titre de la fenètre
    gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200); // Taille par défaut
    g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL); // Connexion au signal de destruction
 
    pVBox = gtk_vbox_new(TRUE, 0); // Création de la box
    gtk_container_add(GTK_CONTAINER(pWindow), pVBox); // Ajout de la box à la fenètre principale
 
    pButton = gtk_button_new_with_label("Lancement de l'application"); // Création du bouton
    gtk_box_pack_start(GTK_BOX(pVBox), pButton, TRUE, FALSE, 0); // Ajout du bouton ds la box
 
    /* Connexion du signal "clicked" du GtkButton */
    /* La donnee supplementaire est la GtkVBox pVBox */
    g_signal_connect(G_OBJECT(pButton), "clicked", G_CALLBACK(lancement_app), (GtkWidget*) pVBox);
    g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
 
    gtk_widget_show_all(pWindow); // Affichage de la fenètre
 
    gtk_main(); // Lancement de la boucle évènementielle
 
    return EXIT_SUCCESS;
}
 
void lancement_app(GtkWidget *pButton, gpointer data)
{
    GtkWidget *fenetreBarre;
    GtkWidget *boutonQuit;
    gchar* titreFBarreUTF8;
    GThread* thread_trait_tram;
 
 
    thread_trait_tram = g_thread_create(TraitementTrame, NULL, FALSE, NULL);
    titreFBarreUTF8 = g_locale_to_utf8("Réception des coordonnées en cours...", -1, NULL, NULL, NULL); // Conversion du titre
 
    fenetreBarre = gtk_window_new(GTK_WINDOW_TOPLEVEL); // Création fenetre
    gtk_window_set_title(GTK_WINDOW(fenetreBarre),titreFBarreUTF8); // Titre de la fenetre
    gtk_window_set_default_size(GTK_WINDOW(fenetreBarre),150, 100); // Taille de la fenetre
    gtk_window_set_position(GTK_WINDOW(fenetreBarre),GTK_WIN_POS_CENTER); // Position de la fenetre
 
    boutonQuit = gtk_button_new_with_label("Arreter l'application"); // Création du bouton quitter
    g_signal_connect(G_OBJECT(boutonQuit), "clicked", G_CALLBACK(ferm_app), fenetreBarre);
    gtk_container_add(GTK_CONTAINER(fenetreBarre), boutonQuit);
 
    gtk_widget_show_all(fenetreBarre); // Affichage de la fenetre
}
 
int ferm_app(GtkWidget *boutonQuit, gpointer fenetreBarre)
{
   gtk_widget_destroy(fenetreBarre);
   g_thread_exit(0);
}
La fonction TraitementTrame lancée par mon thread se trouve dans un autre fichier et est assez longue, c'est pr ca que je ne l'ai pas mise la...