3

我正在尝试改进我的一份报告的执行时间,该报告使用 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 输出。

4

3 回答 3

0

尝试在 cfchart 调用周围放置一个自定义标记并将生成的内容捕获到一个变量中 - 然后使用线程范围访问它。我不肯定这会起作用(取决于您的输出格式)。

于 2012-03-13T13:22:07.437 回答
0

我没有对此进行测试,这只是一个想法,但您可以尝试将 cfchart 放在 cfsavecontent 块中。

于 2012-03-13T13:46:40.140 回答
0

我能够使用 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>

我遇到的问题是动态变量命名/调用。我确信这是一个非常容易解决的问题,但是如果我用我知道会创建的名称来调用每个内容,它就会显示出来——尽管这违背了使用动态变量的目的。但这完全是另一场战斗!答案是肯定的,您可以在 cfthread 中将 cfsavecontent 与 cfcharts 一起使用。

于 2016-10-27T19:48:46.130 回答