2016-12-27 40 views
0

我的項目有運行時間。我用下面的代碼展示它:如何插入一個進度條來顯示項目的運行時間進度?

#include <opencv2/opencv.hpp> 
#include <gtk/gtk.h> 
#include <time.h> 

using namespace cv; 
using namespace std; 

gboolean Func (gpointer data) { 
    gdouble value; 
    GString *text; 

    //part of code that generate run time 
    clock_t start, end; 
    start = clock(); 

    Mat image, src1, DENO; 
    image = imread("C:/Users/Alireza/Desktop/1.png"); 
    cvtColor(image, src1, CV_RGB2GRAY); 
    fastNlMeansDenoising(src1, DENO, 19, 29, 38); 
    imwrite("DENO.png", DENO); 

    end = clock(); 
    int runtime = ((int)(end - start))/CLOCKS_PER_SEC; 
    cout << "Time1 = " << runtime << "s" << endl; 


    //part of code that I want to show run time progress by progress bar 
    value = gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(data)); 

    value += 0.01; 
    if (value > 1.0) { 
     value = 0.0; 
    } 

    text = g_string_new(gtk_progress_bar_get_text(GTK_PROGRESS_BAR(data))); 
    g_string_sprintf(text, "%d%%", (int)(value * 100)); 
    gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(data), value); 
    gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(data), TRUE); 
    gtk_progress_bar_set_text(GTK_PROGRESS_BAR(data), text->str); 

    while (gtk_events_pending()) 
     gtk_main_iteration(); 

    return TRUE; 
} 

int main(int argc, char *argv[]) 
{ 
GtkWidget *window; 
GtkWidget *progressBar; 
gint timer; 

gtk_init(&argc, &argv); 

window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
gtk_window_set_title(GTK_WINDOW(window), "GtkProgressBar"); 
gtk_window_set_default_size(GTK_WINDOW(window), 300, 30); 

progressBar = gtk_progress_bar_new(); 
timer = g_timeout_add(100, Func, progressBar); 

gtk_container_add(GTK_CONTAINER(window), progressBar); 

gtk_widget_show_all(window); 

gtk_main(); 

return 0; 

} 

我想使用進度條顯示進度我的項目。圖片:

1.png

但我不能這些代碼結合在一起,以顯示我的項目的進度運行時間。我是gtk3的新手。有沒有人對此有任何想法或建議?

回答

1

我認爲你的程序還有其他幾個問題。關於進度條:

當你打電話給gtk_progress_bar_set_fraction時,你實際上更新了進度條,但是你沒有給Gtk時間去繪製更新的條。 (另外,gtk_progress_bar_set_fraction的調用應該在for循環中)

所以,爲了讓Gtk能夠做到這一點(並且還要處理其他事件,例如點擊和鍵盤),您必須調用一個函數它允許Gtk主循環關注未決請求。

看看功能gtk_main_iterationgtk_main_iteration_do。你必須在你的數學循環中包含一個。

+0

@ jcoppens:非常感謝您的指導。我更新我的代碼。但我想通過進度條顯示運行時間進度。例如,在我的代碼中,我有一部分生成運行時(與OpenCV的圖像處理相關)。圖像運行時間爲5秒。我想通過進度條(1秒的任何一個等於20%)同時顯示5秒的進度。如果有可能請指導我編輯我的代碼 –

+0

任何沒有身體幫助我? –