【发布时间】: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