2

我将一个 MATLAB 项目部署到一个 DLL 中,以便从 C++ 中调用,它工作得很好。快乐的时光。

但是当用户要求取消操作时会发生什么?

我尝试创建一个global名为UserAborted. 在 MATLAB 中运行 long 函数之前,我将其初始化为 0。我还写了以下两个函数:

function AbortIfUserRequested
    global UserAborted

    if (UserAborted == 1)
        error('User Abort');
    end
end

function UserAbortLongFunction
    global UserAborted

    UserAborted = 1;
end

AbortIfUserRequested在我的 long 函数的循环的每次迭代中调用。我也导出了UserAbortLongFunction

我预计在调用后不久UserAbortLongFunction,长函数会调用到AbortIfUserRequested,并抛出错误。

相反,long 函数一直运行到最后,然后UserAborted才会更改 get的值。

我要做的就是在用户要求我时中止那个长功能!有没有办法做到这一点?

4

3 回答 3

5

尝试在 AbortIfUserRequested 中调用 DRAWNOW 函数。尽管 Matlab 是单线程的(从 API 的角度来看),但它确实允许中断。我通过使用纯 M 代码调用此函数取得了成功,否则用户输入(如 Ctrl-C)会被锁定。

于 2009-09-25T00:27:02.297 回答
1

Matlab 需要提供回调函数来显示执行进度并可能停止它。谷歌搜索显示很多人想要这个,但 Mathworks 没有实现。

于 2009-09-24T09:56:48.763 回答
1

Matlab 的单线程特性可能会阻止对全局变量值的更新在第一个函数执行时传播。您可以尝试将 abort 标志粘贴到 Java 对象(如 HashMap)中,以获得间接层。由于 Java 对象是通过引用传递的,对其状态的更新可能会立即可见,而无需更改 Matlab 变量本身。

这是一个片段。(抱歉,我没有 Matlab 编译器许可证来在已部署的 DLL 中进行测试。)

function AbortIfUserRequested
    global SharedState
    if SharedState.get('UserAborted')
        error('User Abort');
    end
end

function UserAbortLongFunction
    global SharedState
    SharedState.put('UserAborted', 1);
end

function InitUserAbort
    global SharedState
    SharedState = java.util.Collections.synchronizedMap(java.util.HashMap());
    SharedState.put('UserAborted', 0);
end

Matlab 应用程序数据也通过引用有效地传递。将 abort 标志放在 appdata 而不是全局变量中也可能有效。如果您的库与 Matlab GUI 一起使用,您可以将应用程序数据放在其图形句柄而不是全局句柄 0 上。如果它有效,这将比 Java 对象更惯用的 Matlab。

function AbortIfUserRequested
   if getappdata(0, 'UserAborted')
      error('User Abort');
   end
end
function UserAbortLongFunction
   setappdata(0, 'UserAborted', 1);
end
于 2009-09-24T14:37:57.470 回答