按下按钮暂停正在运行的功能
Posted
技术标签:
【中文标题】按下按钮暂停正在运行的功能【英文标题】:Pause a running function pressing a button 【发布时间】:2016-07-23 18:56:40 【问题描述】:我有一个 gtk2+ 代码,其中有一个运行按钮和一个停止按钮。我希望停止按钮在特定点暂停运行功能(而不是离开它),直到再次按下运行按钮,在同一点继续。
问题在于,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);
对解决方案有什么想法吗?
编辑;一种不停止运行main函数的多线程方法:
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 使用不同的线程是什么意思? 如果您为每个耗时的操作(例如循环)启动一个新线程,您可以避免锁定您的应用程序。您的循环将在线程 1 中执行,而在线程 0 中,您的 GUI 仍在运行且未锁定。 here 描述了如何将线程与 boost 库一起使用的示例,如果您不知道线程是什么,那么here 是更多信息。 运行按钮上执行的进程是来自所有者还是外部线程? 【参考方案1】:查看gtk_events_pending 的文档和示例。它说:
这可用于更新 UI 和调用超时等,同时进行一些时间密集型计算。
【讨论】:
以上是关于按下按钮暂停正在运行的功能的主要内容,如果未能解决你的问题,请参考以下文章