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);
}
}
ソリューションにアプローチするためのアイデアはありますか?
EDIT;主な機能の実行を停止しないマルチスレッドのアプローチ:
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);
}
別のスレッドでGUIを実行するとループでブロックされないようにします – JohnDoe2991
一般に、大文字はマクロ/定義に使用され、関数名では使用されません。 – Boiethios
別のスレッド@ JohnDoe2991とはどういう意味ですか? – Keles