我正在努力提高我的一个报告的执行时间,该报告使用cfcharts打印图形。代码本身是一个实体循环,我为每个实体创建一个图表(它是一个比较报告)。
由于报告的复杂性,通过内联完成这项工作几乎需要一分钟或更长的时间,所以我试图在这种情况下使用cfthread,但我不确定这是否可能。
这是代码:
<body>
<cfloop array="#uuids#" index="uuid" >
<cfthread action="run" name="t#threadCount#" output="to#threadCount#">
...
<cfchart >
...
</cfchart>
</cfthread>
...
</cfloop>
</body>
正如预期的那样,cfchart不会在cfthread内"打印",尽管它显然正在执行。如何获得cfthread的输出?一个可能的解决方案是从cfchart创建一个图像,然后在所有线程完成后使用该图像构建文档,但我想知道是否有任何方法可以从cfthread获得cfchart输出。
尝试在cfchart调用周围放置一个自定义标记,并将生成的内容捕获到变量中,然后使用线程范围访问它。我不确定这是否可行(取决于您的输出格式)。
我还没有测试过,这只是一个想法,但您可以尝试将cfchart放入cfsavecontent块中。
我能够使用cfsavecontent进行保存,然后生成带引号的cfcharts。
只需确保使用的任何查询/数据变量都保存在cfsavecontent块中(我在这部分遇到了问题;如果不小心,作用域会有点不稳定)
<body>
<cfloop array="#uuids#" index="uuid" >
<cfthread action="run" name="t#threadCount#" output="to#threadCount#">
<cfsavecontent variable="thisContent">
<cfquery name="thisQuery" datasource="dsource">
...
</cfquery>
<cfchart >
...
</cfchart>
</cfsavecontent>
</cfthread>
...
</cfloop>
<cfloop array="#uuids#" index="uuid" >
<cfthread action="join" name="t#threadCount#"/>
#thisContent#
</cfloop>
</body>
我遇到的问题是动态变量命名/调用。我相信这是一个非常简单的解决方案,但如果我用我知道会创建的名称调用每个内容,它就会被显示出来——尽管这违背了使用动态变量的目的。但这完全是另一场战斗!答案是肯定的,您可以将cfsavecontent与cfthread中的cfcharts一起使用。