在 MPxNode::compute 中使用 MProgressWindow



我可以在方法中使用MProgressWindowMPxNode::compute?我的插件实现不会保留MProgressWindow即使它未被另一个进程使用。

MStatus Node::compute(const MPlug & plug, MDataBlock & data) {
    if (!MProgressWindow::reserve())
        return MS::kFailure;
    MProgressWindow::setTitle(this->typeName);
    MProgressWindow::setInterruptable(true);
    MProgressWindow::setProgressRange(0, 100);
    MProgressWindow::setProgressStatus("Initializing: 0%");
    MProgressWindow::setProgress(0);
    MProgressWindow::startProgress();
    // Some expensive operation.
    // If the user presses ESC key, this ends the progress window and returns failure.
    MProgressWindow::endProgress();
    return MS::kSuccess;
}

注意:删除节点时,会显示MProgressWindow(行为奇怪)。

我感谢任何帮助。

在 Maya 2016 之前,插件代码与 Maya 的 UI 在同一线程中运行。这意味着只要你的插件在做任何事情,Maya 的 UI 就会被冻结。

在你的 compute() 中,MProgressWindow 调用正在排队一堆 UI 操作,但在 compute() 返回并且线程可以将控制权交回 UI 之前,它们不会被处理。

从 Maya 2016 开始,情况变得更加复杂。插件代码是否与 Maya 的 UI 在同一线程中运行取决于评估管理器和节点类型设置。

尝试使用 MComputation 而不是 MProgressWindow。我没有在 compute() 方法中尝试过 MComputation,所以它可能不起作用,但它的设计至少更适合这种用法。

最新更新