2016-04-04 6 views
2

Ich habe einen GTK2 + Code, in dem ich eine laufende und eine haltende Taste habe. Ich möchte, dass die Stopptaste die RUN-Funktion an einem bestimmten Punkt anhält (nicht, um sie zu verlassen), bis die RUN-Taste erneut gedrückt wird, und an demselben Punkt fortfährt.Pause einer laufenden Funktion auf Knopfdruck

Das Problem ist, dass while-Schleifen jede Art von Interaktion mit Programmschnittstellen blockieren und einfriert.

void STOP(GtkWidget *widget, GObject *context_object_stop) 
{ 
    stop=1; 
} 

void RUN(GtkWidget *widget, GObject *context_object_run) 
{ 

    GtkEntry *buffer= g_object_get_data (context_object_run, "buffer"); 
    GtkTextIter iter; 
    GtkTextMark *marker; 
    marker = gtk_text_buffer_get_insert(buffer); 
    gtk_text_buffer_get_iter_at_mark(buffer, &iter, marker); 

    stop=0; 
    int i=0; 

    for (i=0; i<5000000; i=i+1) 
    { 
    while (stop==1) 
    { 
     //here is my problem 
    } 
    gchar * stuff = g_strdup_printf("%d""\n", i); 
    gtk_text_buffer_insert(buffer, &iter, stuff, -1); 
    g_free(stuff); 
    while (gtk_events_pending()) 
    gtk_main_iteration(); 
    gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(wins), marker); 
    } 

} 

Irgendwelche Ideen, um die Lösung zu nähern?


EDIT; Ein Ansatz von Multithreading, die nicht die Hauptfunktion läuft nicht stoppen:

stop=0; 
    int i=0; 
    pthread_t th1; 

    for (i=0; i<5000000; i=i+1) 
    { 
    void *StopRun(void *arg) 
    { 
    while (stop==1) 
    { 
     //here is my problem 
    } 
    } 
    if (stop==1) 
    { 
    pthread_create(&th1, NULL, (void*)StopRun, NULL); 
    } 
    gchar * stuff = g_strdup_printf("%d""\n", i); 
    gtk_text_buffer_insert(buffer, &iter, stuff, -1); 
    g_free(stuff); 
    while (gtk_events_pending()) 
    gtk_main_iteration(); 
    gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(wins), marker); 
    } 
+3

sollten Sie Ihre GUI in einem anderen Thread laufen lassen, damit sie nicht von Ihren Schleifen blockiert wird – JohnDoe2991

+1

allgemein, Großbuchstaben werden für Makros/Definitionen verwendet, nicht Funktionsnamen. – Boiethios

+0

Was meinst du mit einem anderen Thread, @ JohnDoe2991? – Keles

Antwort

0

Haben Sie einen die Dokumentation und Beispiele für gtk_events_pending aussehen. Dort heißt es:

Damit kann die Benutzeroberfläche zu aktualisieren und Timeouts usw. aufrufen, während einige Zeit intensive Berechnung zu tun.