队长的博客: https://www.cnblogs.com/nxopen2018/p/13174207.html
显示此对话框,点击可中断操作:
用到的ufun函数:
UF_ABORT_ask_flag_status 检查用户是否通过按CTRL+SHIFT+L键或在工作进程对话框中选择停止来发出中止请求
UF_ABORT_clear_abort 清除任何挂起的中止请求。如果处理了中止请求,则应该调用它。
UF_ABORT_disable_abort 禁用中止处理程序
UF_ABORT_enable_abort 启用中止处理程序
源码:
#include <uf.h> #include <uf_ui.h> #include <uf_abort.h> #include <uf_modl.h> extern DllExport void ufusr(char *param, int *returnCode, int rlen) { UF_initialize(); UF_ABORT_clear_abort();//清除标记位 UF_ABORT_enable_abort();//打开中断检测(对话框) bool isUserClickWidget = false; for (int i = 0; i < 200; i++) { //创建块 UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔 double Corner_pt[3] = { i * 120, 0.0, 0.0 };//设置原点 char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高 tag_t BlkTag = NULL_TAG; UF_MODL_create_block1(Sign, Corner_pt, Edge_Len, &BlkTag); logical logi; UF_ABORT_ask_flag_status(&logi);//访问中断标记 if (logi) { //用户中断标记 UF_ABORT_clear_abort();//清除标记位 isUserClickWidget = true; break; } } if (isUserClickWidget) { uc1601("用户退出", 1); } else { uc1601("自然结束", 1); } UF_ABORT_disable_abort();//关闭中断检测(对话框) UF_terminate(); } extern int ufusr_ask_unload(void) { return (UF_UNLOAD_IMMEDIATELY); }
结果(自然结束):
结果(用户终止):
存在BUG:用户点击停止时,程序没有停止。最后自然结束。我们发现少创建了一个块:(后面分析原因)
编写测试程序,仅循环创建块:
#include <uf.h> #include <uf_ui.h> #include <uf_abort.h> #include <uf_modl.h> extern DllExport void ufusr(char *param, int *returnCode, int rlen) { UF_initialize(); for (int i = 0; i < 200; i++) { //创建块 UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔 double Corner_pt[3] = { i * 120, 0.0, 0.0 };//设置原点 char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高 tag_t BlkTag = NULL_TAG; UF_MODL_create_block1(Sign, Corner_pt, Edge_Len, &BlkTag); } UF_terminate(); } extern int ufusr_ask_unload(void) { return (UF_UNLOAD_IMMEDIATELY); }
结果:
可以看到即使我们不使用UF_ABORT_enable_abort();NX也会在UF_MODL_create_block1()时,自己弹出询问中断的对话框。并且我试过如果用户中断UF_MODL_create_block1()这个函数会返回一个值:66,代表:User abort(用户终止)
完善后的代码:
#include <uf.h> #include <uf_ui.h> #include <uf_abort.h> #include <uf_modl.h> extern DllExport void ufusr(char *param, int *returnCode, int rlen) { UF_initialize(); UF_ABORT_clear_abort();//清除标记位 UF(UF_ABORT_enable_abort());//打开中断检测(对话框) bool isUserClickWidget = false; int failcode = 0; for (int i = 0; i < 200; i++) { //创建块 UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔 double Corner_pt[3] = { i * 120, 0.0, 0.0 };//设置原点 char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高 tag_t BlkTag = NULL_TAG; failcode=UF_MODL_create_block1(Sign, Corner_pt, Edge_Len, &BlkTag); //错误代码:66,错误原因:User abort logical logi; UF_ABORT_ask_flag_status(&logi);//访问中断标记 if ((logi)||(failcode)) { //用户中断标记 UF_ABORT_clear_abort();//清除标记位 isUserClickWidget = true; break; } } if (isUserClickWidget) { uc1601("用户退出", 1); if (failcode) { uc1601("创建块终止", 1); } } else { uc1601("自然结束", 1); } UF_ABORT_disable_abort();//关闭中断检测(对话框) UF_terminate(); } extern int ufusr_ask_unload(void) { return (UF_UNLOAD_IMMEDIATELY); }
结果: