Advertisement
Guest User

Untitled

a guest
Feb 3rd, 2018
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.80 KB | None | 0 0
  1. #include <glib.h>
  2. #include <gtk/gtk.h>
  3. #include <gdk/gdk.h>
  4. #include <sys/time.h>
  5. #include <stdlib.h>
  6. GtkWidget *window;
  7. GtkWidget *vbox;
  8. GtkWidget *hbox1;
  9. GtkWidget *hbox2;
  10. GtkTextView *textview;
  11. GtkWidget *scrolledwindow;
  12. GtkWidget *button1;
  13. GtkWidget *button2;
  14. GThread *thread;
  15. volatile int thread_exec_flag01;
  16.  
  17. void append_text(GtkTextView *textview , const gchar *text);
  18. void set_text(GtkTextView *textview, const gchar *text);
  19. void delete_text(GtkTextView *textview);
  20. void scroll_to_bottom(GtkScrolledWindow *scrolled_window);
  21.  
  22. double seconds() {
  23. struct timeval tm;
  24. double t ;
  25. static int base_sec = 0,base_usec = 0;
  26. gettimeofday(&tm, NULL);
  27. if(base_sec == 0 && base_usec == 0)
  28. {
  29. base_sec = tm.tv_sec; base_usec = tm.tv_usec; t = 0.0;
  30. } else {
  31. t = (double) (tm.tv_sec-base_sec) + ((double) (tm.tv_usec-base_usec))/1.0e6 ;
  32. }
  33. return t;
  34. }
  35.  
  36. gpointer sieve_of_eratosthenes_func ( gpointer data ) {
  37. double start_time, end_time;
  38. gchar buf[512];
  39. int max_number, i, j;
  40. char *num_array;
  41. max_number = 200000; /* max_number = 2000に設定 */
  42. if (NULL == (num_array = (char *)malloc(sizeof(char) * max_number))) {
  43. sprintf(buf, "メモリ確保に失敗しました\n");
  44. gdk_threads_enter();
  45. append_text(GTK_TEXT_VIEW(data), buf);
  46. gdk_threads_leave();
  47. return;
  48. };
  49. gdk_threads_enter();
  50. delete_text(GTK_TEXT_VIEW(textview)); /* TextViewの内容を空にする */
  51. sprintf(buf, "エラトステネスのふるい\n素数を求めます\n");
  52. append_text(GTK_TEXT_VIEW(textview), buf);
  53. gdk_threads_leave();
  54. start_time = seconds(); /* 時間計測開始 */
  55. num_array[0] = 0;
  56. num_array[1] = 0;
  57. for(i = 2; i < max_number; i++) {
  58. num_array[i] = 1;
  59. }
  60. for(i = 0; i < max_number; i++){
  61. if(num_array[i] != 0) {
  62. for(j = 2;(j * i) < max_number; j++) {
  63. num_array[j * i] = 0;
  64. }
  65. }
  66. }
  67. end_time = seconds();
  68. for(i = 0; i < max_number; i++) {
  69. if(num_array[i] != 0) {
  70. sprintf(buf, "%d\n", i);
  71. gdk_threads_enter();
  72. append_text(GTK_TEXT_VIEW(textview), buf);
  73. gdk_threads_leave();
  74. }
  75. }
  76. sprintf(buf, " 実行時間: %.4f秒\n", end_time - start_time);
  77. gdk_threads_enter();
  78. append_text(GTK_TEXT_VIEW(textview), buf);
  79. gdk_threads_leave();
  80. usleep(500000);
  81. gdk_threads_enter();
  82. scroll_to_bottom(scrolledwindow);
  83. gdk_threads_leave();
  84. free(num_array);
  85. thread_exec_flag01 = 0;
  86. }
  87.  
  88. void delete_text(GtkTextView *textview){
  89. GtkTextBuffer *buffer;
  90. GtkTextIter start, end;
  91. buffer = gtk_text_view_get_buffer(textview);
  92. gtk_text_buffer_get_start_iter (buffer , &start);
  93. gtk_text_buffer_get_end_iter (buffer , &end);
  94. gtk_text_buffer_delete(buffer, &start, &end);
  95. }
  96.  
  97. void set_text(GtkTextView *textview, const gchar *text)
  98. {
  99. GtkTextBuffer *buffer;
  100. buffer = gtk_text_view_get_buffer(textview);
  101. gtk_text_buffer_set_text(buffer, text, -1);
  102. }
  103.  
  104. void append_text(GtkTextView *textview , const gchar *text)
  105. {
  106. GtkTextBuffer *buffer;
  107. GtkTextIter iter;
  108. buffer = gtk_text_view_get_buffer (textview);
  109. gtk_text_buffer_get_end_iter(buffer, &iter);
  110. gtk_text_buffer_insert(buffer, &iter, text, -1);
  111. }
  112.  
  113. void scroll_to_bottom(GtkScrolledWindow *scrolled_window)
  114. {
  115. GtkAdjustment *vadj;
  116. gdouble size;
  117. vadj = gtk_scrolled_window_get_vadjustment(scrolled_window);
  118. size = gtk_adjustment_get_upper(vadj) - gtk_adjustment_get_page_size(vadj);
  119. if (size < 0) size = 0.0;
  120. gtk_adjustment_set_value(vadj, size);
  121. }
  122.  
  123. static void thread_func(GtkWidget *widget, gpointer data)
  124. {
  125. GError *error;
  126. if (thread_exec_flag01 == 0) {
  127. thread_exec_flag01 = 1;
  128. thread = g_thread_create( sieve_of_eratosthenes_func, (gpointer)data, FALSE, &error );
  129. }
  130. }
  131.  
  132. int main(int argc, char** argv)
  133. {
  134. int window_width = 400;
  135. int window_height = 400;
  136.  
  137. thread_exec_flag01 = 0;
  138. gtk_init(&argc, &argv);
  139.  
  140. gdk_threads_init();
  141. gdk_threads_enter();
  142.  
  143. window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  144. gtk_window_set_title(GTK_WINDOW(window), "Sieve of Eratosthenes");
  145. gtk_widget_set_size_request(window, window_width, window_height);
  146. gtk_container_set_border_width(GTK_CONTAINER(window), 5);
  147.  
  148. g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
  149.  
  150. vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
  151. gtk_container_add(GTK_CONTAINER(window), vbox);
  152.  
  153. scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
  154. gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_ETCHED_OUT);
  155. gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
  156. gtk_widget_set_size_request(GTK_SCROLLED_WINDOW(scrolledwindow), window_width, window_height - 40);
  157. gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0);
  158.  
  159. textview = gtk_text_view_new();
  160. gtk_container_add(GTK_CONTAINER(scrolledwindow), textview);
  161. set_text(GTK_TEXT_VIEW(textview), "");
  162.  
  163. hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
  164. gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 0);
  165. button1 = gtk_button_new_from_stock(GTK_STOCK_QUIT);
  166. g_signal_connect(G_OBJECT(button1), "clicked", G_CALLBACK(gtk_main_quit), NULL);
  167. gtk_box_pack_end(GTK_BOX(hbox1), button1, FALSE, FALSE, 0);
  168. button2 = gtk_button_new_with_label("開始");
  169. g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(thread_func), (gpointer)textview);
  170. gtk_box_pack_end(GTK_BOX(hbox1), button2, FALSE, FALSE, 0);
  171.  
  172. gtk_widget_show_all(window);
  173. gtk_main();
  174. gdk_threads_leave();
  175. return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement