我一直在用Python写一个Nuke渲染管理器并遇到了一个问题:
nuke.cancel()
似乎没有正常工作.我的python脚本创建一个主类并连接到服务器(用Java编写),然后进入无限循环,每次都获得一个新任务(以JSON对象的形式).它获得的每个循环打开一个脚本?找到写节点并执行它们.要将进度报告回服务器,我已经添加了回调:
nuke.addBeforeFrameRender(lambda: self._pre_frame_render())
以及
nuke.addAfterFrameRender(lambda: self._post_frame_render())
在哪里
def _pre_frame_render(self):
self._host_socket.send(struct.pack('>b', 1))
self._host_socket.send(struct.pack('>i', nuke.frame()))
def _post_frame_render(self):
self._host_socket.send(struct.pack('>b', 2))
self._host_socket.send(struct.pack('>i', nuke.frame()))
Run Code Online (Sandbox Code Playgroud)
要cancel
在服务器上启用方法,我有一个单独的线程在渲染处于活动状态时运行并等待"取消"请求
class CancelHandler(threading.Thread):
def __init__(self, input_socket, cancel_callback):
threading.Thread.__init__(self)
self.cancel_set = threading.Event()
self.run_set = threading.Event()
self._input_socket = input_socket
self._cancel_callback = cancel_callback
def run(self):
while True:
if self.run_set.is_set():
msg_raw = recv_msg(self._input_socket)
msg = json.loads(msg_raw)
if 'mode' in msg and msg['mode'] == 'cancel':
print msg_raw
self.cancel_set.set()
self.run_set.clear()
self._cancel_callback()
Run Code Online (Sandbox Code Playgroud)
在cancel_callback
被定义为
def _cancel_callback(self):
nuke.cancel()
self._is_canceled = True
Run Code Online (Sandbox Code Playgroud)
在循环开始之前,我启动CancelHandler
线程,并在每次迭代时 …
a 遇到的具体问题是编译器处理它的方式存在一些不一致。
例如这个代码(https://godbolt.org/z/08Z-zi):
constexpr auto value = 1;
static_assert(*const_cast<int *>(&value), "value should be 1");
Run Code Online (Sandbox Code Playgroud)
使用 GCC、Clang 和 MSVC 编译良好,但使用英特尔 C++ 编译器 19.0.1 失败并出现以下错误:
error: expression must have a constant value
static_assert(*const_cast<int *>(&value), "value should be 1");
Run Code Online (Sandbox Code Playgroud)
据我所知,标准没有明确说明const_cast
常量表达式中不允许使用 a。通过结果指针写入将是未定义的,因此不允许,但读取应该没问题。
考虑到所有主要编译器都会编译此代码(包括 ICC < 19.0.1),这可能只是 ICC 19.0.1 中的回归。
c++ const-cast language-lawyer constant-expression constexpr