2016-04-04 173 views
2

我有一個gtk2 +代碼,其中有一個運行按鈕和一個停止按鈕。我希望停止按鈕將RUN功能暫停(不要離開它)在一個特定的點上,直到再次按下運行按鈕,繼續在同一點。按下按鈕暫停運行功能

問題是while循環阻止任何與程序接口的交互並凍結。

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); 
    } 

} 

任何想法來解決方案?


編輯;多線程的方式,不能停止運行的主要功能:

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

你應該在不同的線程中運行你的GUI,所以它不會被你的循環阻塞 – JohnDoe2991

+1

一般來說,大寫字母用於宏/定義而不是函數名。 – Boiethios

+0

你的意思是不同的線程,@ JohnDoe2991? – Keles

回答

0

看看文檔和gtk_events_pending例子。它說:

這可以用來更新UI和調用超時等,同時做一些時間密集型計算。