【问题标题】:R tcltk responsive gui during calculation计算期间 R tcltk 响应式 gui
【发布时间】:2016-04-04 14:39:22
【问题描述】:

你好亲爱的堆栈溢出社区。​​p>

我目前正在开发一个 R 项目,用于进行涉及 gui 和耗时启发式的统计计算。在 gui 中应该是一个开始和停止计算的按钮和一个报告迄今为止最好的错误的文本字段。

所以我一直在思考如何在计算过程中保持 gui 响应的问题。

一些示例代码

require("tcltk")

result<-tclVar("")

start<-function(){
  active<<-TRUE
  tkconfigure(button,text="stop",command=stop)
  dostuff()
}

stop<-function(){
  active<<-FALSE
  tkconfigure(button,text="start",command=start)
}

dostuff<-function(){#this would be the optimization function
  while(active){
  tclvalue(result)<-#do some stuff
  }
}


toplevel<-tktoplevel()
button<-tkbutton(toplevel,text="start",command=start)
entry<-tkentry(toplevel,textvariable=result)
tkpack(button)
tkpack(entry)

在 do stuff 函数中,一些多线程的东西似乎是必要的。它是在 windows 和 linux 上工作的要求。我希望有想法如何存档。提前致谢

【问题讨论】:

  • 欢迎来到 SO。您是否可以将收到的错误作为问题的一部分发布?
  • 谢谢。问题是:当用户单击按钮时,R 开始计算 dostuff 函数并且不再对 gui 事件做出反应。 gui 冻结,用户没有机会停止 doStuff 执行。所以必须将 gui 和计算过程/线程分开,我要求最好的方法来做到这一点
  • Tcl/Tk 和 R 使用相同的执行线程(“进程”),这就是 UI 冻结直到长时间运行的计算完成的原因。我认为你只需要在dostuff() 中开始一个新线程(我不能告诉你如何 ATM)。一个特殊的问题可能是更新 dostuff 内部的 UI,因为如果两个不同的线程访问同一个 UI,它们可能会导致奇怪的副作用......

标签: r multithreading user-interface tcl tk


【解决方案1】:

我认为最简单的方法是使用 systemsystem2wait=FALSE 参数将 R 脚本作为后台进程启动,以便在后台处理长时间运行的计算。

如果您想更新 UI 以显示中间结果或进度,R 脚本必须将当前状态写入可用于更新 UI 的“交换”文件。

要更新 UI,您必须定期检查新状态 e。 G。通过使用 Tcl/Tk 的after 命令,参见:

http://www.tcl.tk/man/tcl/TclCmd/after.htm

有关将 R 脚本作为后台进程启动的示例,请参见此处:

http://stackoverflow.com/questions/14208976/r-run-source-in-background

请注意,R 是单线程的,并且更新 Tk-UI 必须从创建 UI 的同一线程(进程)完成,因为主事件循环在这里运行。

另外请注意,您不应允许用户在后台任务运行时通过 UI 进行有冲突的更改(例如,启动另一个后台任务 - 除非您希望支持这一点)。

通过 UI 取消后台进程(“取消按钮”)最好使用另一个由后台进程定期检查的“信号文件”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多