按下按钮暂停正在运行的功能

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 和调用超时等,同时进行一些时间密集型计算。

【讨论】:

以上是关于按下按钮暂停正在运行的功能的主要内容,如果未能解决你的问题,请参考以下文章

如何暂停整个程序的执行,直到在 JAVA 中按下按钮?

当用户按下主页按钮时停止声音

从另一个线程更改按钮图标/切换按钮

使 Pyqt 按钮在鼠标按下而不是鼠标按下时运行功能

如何让程序暂停,然后有自己控制再运行!求助!vc6.0

Powershell表单 - 使用按钮暂停循环