Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <glib.h>
- #include <gtk/gtk.h>
- #include <gdk/gdk.h>
- #include <sys/time.h>
- #include <stdlib.h>
- GtkWidget *window;
- GtkWidget *vbox;
- GtkWidget *hbox1;
- GtkWidget *hbox2;
- GtkTextView *textview;
- GtkWidget *scrolledwindow;
- GtkWidget *button1;
- GtkWidget *button2;
- GThread *thread;
- volatile int thread_exec_flag01;
- void append_text(GtkTextView *textview , const gchar *text);
- void set_text(GtkTextView *textview, const gchar *text);
- void delete_text(GtkTextView *textview);
- void scroll_to_bottom(GtkScrolledWindow *scrolled_window);
- double seconds() {
- struct timeval tm;
- double t ;
- static int base_sec = 0,base_usec = 0;
- gettimeofday(&tm, NULL);
- if(base_sec == 0 && base_usec == 0)
- {
- base_sec = tm.tv_sec; base_usec = tm.tv_usec; t = 0.0;
- } else {
- t = (double) (tm.tv_sec-base_sec) + ((double) (tm.tv_usec-base_usec))/1.0e6 ;
- }
- return t;
- }
- gpointer sieve_of_eratosthenes_func ( gpointer data ) {
- double start_time, end_time;
- gchar buf[512];
- int max_number, i, j;
- char *num_array;
- max_number = 200000; /* max_number = 2000に設定 */
- if (NULL == (num_array = (char *)malloc(sizeof(char) * max_number))) {
- sprintf(buf, "メモリ確保に失敗しました\n");
- gdk_threads_enter();
- append_text(GTK_TEXT_VIEW(data), buf);
- gdk_threads_leave();
- return;
- };
- gdk_threads_enter();
- delete_text(GTK_TEXT_VIEW(textview)); /* TextViewの内容を空にする */
- sprintf(buf, "エラトステネスのふるい\n素数を求めます\n");
- append_text(GTK_TEXT_VIEW(textview), buf);
- gdk_threads_leave();
- start_time = seconds(); /* 時間計測開始 */
- num_array[0] = 0;
- num_array[1] = 0;
- for(i = 2; i < max_number; i++) {
- num_array[i] = 1;
- }
- for(i = 0; i < max_number; i++){
- if(num_array[i] != 0) {
- for(j = 2;(j * i) < max_number; j++) {
- num_array[j * i] = 0;
- }
- }
- }
- end_time = seconds();
- for(i = 0; i < max_number; i++) {
- if(num_array[i] != 0) {
- sprintf(buf, "%d\n", i);
- gdk_threads_enter();
- append_text(GTK_TEXT_VIEW(textview), buf);
- gdk_threads_leave();
- }
- }
- sprintf(buf, " 実行時間: %.4f秒\n", end_time - start_time);
- gdk_threads_enter();
- append_text(GTK_TEXT_VIEW(textview), buf);
- gdk_threads_leave();
- usleep(500000);
- gdk_threads_enter();
- scroll_to_bottom(scrolledwindow);
- gdk_threads_leave();
- free(num_array);
- thread_exec_flag01 = 0;
- }
- void delete_text(GtkTextView *textview){
- GtkTextBuffer *buffer;
- GtkTextIter start, end;
- buffer = gtk_text_view_get_buffer(textview);
- gtk_text_buffer_get_start_iter (buffer , &start);
- gtk_text_buffer_get_end_iter (buffer , &end);
- gtk_text_buffer_delete(buffer, &start, &end);
- }
- void set_text(GtkTextView *textview, const gchar *text)
- {
- GtkTextBuffer *buffer;
- buffer = gtk_text_view_get_buffer(textview);
- gtk_text_buffer_set_text(buffer, text, -1);
- }
- void append_text(GtkTextView *textview , const gchar *text)
- {
- GtkTextBuffer *buffer;
- GtkTextIter iter;
- buffer = gtk_text_view_get_buffer (textview);
- gtk_text_buffer_get_end_iter(buffer, &iter);
- gtk_text_buffer_insert(buffer, &iter, text, -1);
- }
- void scroll_to_bottom(GtkScrolledWindow *scrolled_window)
- {
- GtkAdjustment *vadj;
- gdouble size;
- vadj = gtk_scrolled_window_get_vadjustment(scrolled_window);
- size = gtk_adjustment_get_upper(vadj) - gtk_adjustment_get_page_size(vadj);
- if (size < 0) size = 0.0;
- gtk_adjustment_set_value(vadj, size);
- }
- static void thread_func(GtkWidget *widget, gpointer data)
- {
- GError *error;
- if (thread_exec_flag01 == 0) {
- thread_exec_flag01 = 1;
- thread = g_thread_create( sieve_of_eratosthenes_func, (gpointer)data, FALSE, &error );
- }
- }
- int main(int argc, char** argv)
- {
- int window_width = 400;
- int window_height = 400;
- thread_exec_flag01 = 0;
- gtk_init(&argc, &argv);
- gdk_threads_init();
- gdk_threads_enter();
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(window), "Sieve of Eratosthenes");
- gtk_widget_set_size_request(window, window_width, window_height);
- gtk_container_set_border_width(GTK_CONTAINER(window), 5);
- g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
- vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
- gtk_container_add(GTK_CONTAINER(window), vbox);
- scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_ETCHED_OUT);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_widget_set_size_request(GTK_SCROLLED_WINDOW(scrolledwindow), window_width, window_height - 40);
- gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0);
- textview = gtk_text_view_new();
- gtk_container_add(GTK_CONTAINER(scrolledwindow), textview);
- set_text(GTK_TEXT_VIEW(textview), "");
- hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
- gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 0);
- button1 = gtk_button_new_from_stock(GTK_STOCK_QUIT);
- g_signal_connect(G_OBJECT(button1), "clicked", G_CALLBACK(gtk_main_quit), NULL);
- gtk_box_pack_end(GTK_BOX(hbox1), button1, FALSE, FALSE, 0);
- button2 = gtk_button_new_with_label("開始");
- g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(thread_func), (gpointer)textview);
- gtk_box_pack_end(GTK_BOX(hbox1), button2, FALSE, FALSE, 0);
- gtk_widget_show_all(window);
- gtk_main();
- gdk_threads_leave();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement