为什么 DXL 脚本可以在 DOORS 中运行但在 运行 批处理模式下却不能运行的一些常见原因是什么?
What are some common reasons for why a DXL script would work in DOORS but not when it's run in batch mode?
我有一个 dxl 脚本,它在 DOORS 应用程序中 运行 时有效,但在批处理模式下 运行 时无效。我不确定为什么会这样。 运行在批处理模式下出现以下错误:
doors:断言失败,第 3173 行,document.cpp:!nls_("unexpected: tree root does not have a name attribute") stack
我知道创建 GUI 和类似的东西可能会导致此错误,但我没有这样做。奇怪的是脚本在不同的模块和模块的不同部分停止 运行ning。因此,脚本每次 运行 都会在 DOORS 的不同区域出现故障。
以下是我认为可能导致批处理模式错误的相关代码:
Buffer bsz = create
void addNewLineSeparator(Buffer& b)
{
if (length(b) > 0)
{
b += "\n"
}
}
void display(string s)
{
addNewLineSeparator(bsz)
bsz += s
}
void displayRich(string s)
{
addNewLineSeparator(bsz)
bsz += s
}
void displayRichWithColour(string s)
{
addNewLineSeparator(bsz)
bsz += s
}
void displayRichWithColor(string s)
{
addNewLineSeparator(bsz)
bsz += s
}
void display(Attr__ a)
{
string s = richText a
if (!null s)
{
displayRich s
}
}
string showOut(Object o, int depth) {
Link l
LinkRef lr
ModName_ otherMod = null
Module linkMod = null
ModuleVersion otherVersion = null
Object othero
string disp = null
string s = null
string plain, plainDisp
int plainTextLen
int count
bool doneOne = false
string linkModName = "*"
for l in all(o->linkModName) do {
otherVersion = targetVersion l
otherMod = module(otherVersion)
if (null otherMod || isDeleted otherMod) continue
othero = target l
if (null othero) {
load(otherVersion, false)
}
othero = target l
if (null othero) continue
if (isDeleted othero) continue
doneOne = true
if (depth == 1) {
s = fullName(otherMod)
if (isBaseline(otherVersion)) {
s = s " [" versionString(otherVersion) "]"
}
if (s == "")
displayRich("\pard " " ")
else
displayRich("\pard " s)
}
}
return s
}
for o in m do
{
print showOut(o, 1)
}
任何可能依赖于视图的东西都可能发生这种情况。 DOORS 的批处理模式可能很挑剔。此外,DOORS 在内存管理方面并不十分谨慎——如果可以的话,将代码分成多个部分可能更有意义,其中一个部分运行一个轻量级集,该集在 'eval_' 函数内运行其他代码。这将有助于更顺畅地保持内存 de-allocation 运行(我曾使用此技巧对我们的数据库进行完整 link 清点 - 超过 16000 个模块打开和关闭!)
回复您的编辑:
您显示的代码是 Layout DXL,它在显示视图时进行评估 - 具体来说,'displayRich' 函数试图获取一个富文本字符串并将其放入适当的列 - 但该列不存在,因为视图上下文不是以批处理模式创建的。
一个简单的解决方法是将整个代码包装在:
if(!isBatch){
// Your Code Here
}
这将确保仅当用户处于 non-batch 模式的 运行 DOORS 时才计算 DXL。
我有一个 dxl 脚本,它在 DOORS 应用程序中 运行 时有效,但在批处理模式下 运行 时无效。我不确定为什么会这样。 运行在批处理模式下出现以下错误:
doors:断言失败,第 3173 行,document.cpp:!nls_("unexpected: tree root does not have a name attribute") stack
我知道创建 GUI 和类似的东西可能会导致此错误,但我没有这样做。奇怪的是脚本在不同的模块和模块的不同部分停止 运行ning。因此,脚本每次 运行 都会在 DOORS 的不同区域出现故障。
以下是我认为可能导致批处理模式错误的相关代码:
Buffer bsz = create
void addNewLineSeparator(Buffer& b)
{
if (length(b) > 0)
{
b += "\n"
}
}
void display(string s)
{
addNewLineSeparator(bsz)
bsz += s
}
void displayRich(string s)
{
addNewLineSeparator(bsz)
bsz += s
}
void displayRichWithColour(string s)
{
addNewLineSeparator(bsz)
bsz += s
}
void displayRichWithColor(string s)
{
addNewLineSeparator(bsz)
bsz += s
}
void display(Attr__ a)
{
string s = richText a
if (!null s)
{
displayRich s
}
}
string showOut(Object o, int depth) {
Link l
LinkRef lr
ModName_ otherMod = null
Module linkMod = null
ModuleVersion otherVersion = null
Object othero
string disp = null
string s = null
string plain, plainDisp
int plainTextLen
int count
bool doneOne = false
string linkModName = "*"
for l in all(o->linkModName) do {
otherVersion = targetVersion l
otherMod = module(otherVersion)
if (null otherMod || isDeleted otherMod) continue
othero = target l
if (null othero) {
load(otherVersion, false)
}
othero = target l
if (null othero) continue
if (isDeleted othero) continue
doneOne = true
if (depth == 1) {
s = fullName(otherMod)
if (isBaseline(otherVersion)) {
s = s " [" versionString(otherVersion) "]"
}
if (s == "")
displayRich("\pard " " ")
else
displayRich("\pard " s)
}
}
return s
}
for o in m do
{
print showOut(o, 1)
}
任何可能依赖于视图的东西都可能发生这种情况。 DOORS 的批处理模式可能很挑剔。此外,DOORS 在内存管理方面并不十分谨慎——如果可以的话,将代码分成多个部分可能更有意义,其中一个部分运行一个轻量级集,该集在 'eval_' 函数内运行其他代码。这将有助于更顺畅地保持内存 de-allocation 运行(我曾使用此技巧对我们的数据库进行完整 link 清点 - 超过 16000 个模块打开和关闭!)
回复您的编辑:
您显示的代码是 Layout DXL,它在显示视图时进行评估 - 具体来说,'displayRich' 函数试图获取一个富文本字符串并将其放入适当的列 - 但该列不存在,因为视图上下文不是以批处理模式创建的。
一个简单的解决方法是将整个代码包装在:
if(!isBatch){
// Your Code Here
}
这将确保仅当用户处于 non-batch 模式的 运行 DOORS 时才计算 DXL。