Cfcfhart в пределах cfthread возможно? как получить вывод?
Я пытаюсь улучшить время выполнения одного из моих отчетов, который использует 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 и просто использовать изображение для построения документа в более позднее время, когда все потоки закончатся, но мне было интересно, есть ли какой-нибудь способ получить вывод cfchart из cfthread.
3 ответа
Попробуйте поместить пользовательский тег вокруг вызова cfchart и записать сгенерированное содержимое в переменную, а затем получить к нему доступ, используя область потоков. Я не уверен, что это будет работать (в зависимости от вашего формата вывода).
Я смог использовать 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 с cfcharts внутри cfthread.
Я не проверял это, это просто идея, но вы можете попробовать поместить cfchart в блок cfsavecontent.