当使用无限循环时,搅拌器会冻结

时间:2015-10-02 07:49:07

标签: python ubuntu blender

我正在使用客户端服务器架构,客户端在混合器上。

因为客户端必须无限地等待来自服务器的文本,所以我使用了无限循环。但是,Blender冻结了我运行脚本的那一刻,它没有显示每一步中发生的任何事情,当我使用命令行手动结束执行时,它只显示最后一步执行。

如果在搅拌机外面运行,脚本可以正常工作。我在ubuntu上使用Blender 2.74。

有什么建议吗?

由于

1 个答案:

答案 0 :(得分:1)

您遇到的问题是基于每个事件的交互式应用程序的标准问题:输入事件并显示其响应发生在应用程序主事件循环中,其中要点是

while(running) {
    event = poll_event()
    if( event ) {
        dispatch_event(event)
    }
    redraw_window()
}

现在,当您在Blender中执行脚本时,这会发生在dispatch_event()调用链“内部”某处,以响应某些事件,例如您单击UI按钮或点击运行脚本热键,或者只是Blender执行你的脚本,因为它已被注册为某事物的钩子。

只要您的循环正在运行,在dispatch_event()中,主应用程序循环的执行就会停止,冻结程序的其余部分。

那么你能做些什么:要么不在你的程序中实现这样的内部服务器循环,要么使用框架的方法来注册一个新的事件并在现有的事件循环上搭载(在Blender中这被称为“ 模态 运算符“。或者,在您的情况下可能是首选项,为您的服务器创建一个线程,以便同时运行到主事件循环

另请参阅https://www.blender.org/api/blender_python_api_2_76_1/info_gotcha.html#can-i-redraw-during-the-script,这与您的情况相关。