Потоки ColdFusion: циклические переменные сеанса + сон - PullRequest
1 голос
/ 17 августа 2010

Эй, ребята, я пытаюсь создать таймер, который подсчитывает время, проведенное на странице, используя поток, вот что у меня есть:

<cfset session.time=0>
<cfthread name="timer" action="run">
<cfscript>
  counter = 0;
  while (counter <9000) {
    sleep(1000);
    session.time++;
    counter ++;
} 
</cfscript>
</cfthread>

страница 2:

<cfoutput>#session.time#</cfoutput>

страница 2 дает мне 0 каждый раз, когда кто-либо видит проблему?

edit: я изменил строку 1 своего кода на <cfset session.time=100>, и теперь страница 2 говорит 100, это как материал внутри цикла cfscript isn 'переназначение сессии. время

Ответы [ 3 ]

0 голосов
/ 17 августа 2010

Это работает для меня.

Вы уверены, что используете версию ColdFusion для разработчиков или предприятий, и потоки уже запущены?Я думаю, что только эти выпуски поддерживают многопоточность.

Один из способов убедиться в том, что ваши темы работают, - использовать cfstat - вы должны увидеть один запрос, даже если ваша страница вернулась.

Другой способ - записать вывод из вашего порожденного потока - используйте код, отсекаемый ниже, для записи в System.out - в идеале для этого вам нужно запустить CF в качестве консольной задачи.

<cfset session.time=0 />

<cfthread name="timer" action="run">
<cfscript>
  counter = 0;
  while (counter <9000) {
    sleep(1000);
    session.time++;

    sys = createObject("java", "java.lang.System");
    sys.out.println("*** [DEBUG]  - #timeformat(now(),'HH:mm:ss' )# - session.time=#session.time# ");

    counter ++;
} 
</cfscript>
</cfthread>
0 голосов
/ 18 августа 2010

Код, выполняемый внутри потока, имеет собственную область видимости, включая сессию. Я бы установил переменную внутри протектора, а затем получил бы к ней доступ из области видимости потоков.

т.е. изменение session.time++; to thread.time++;, а затем используйте cfthread[timer].time для получения времени в потоке.

Хотя это может не сработать, если вы включите управление сеансом, как обсуждают некоторые другие сообщения.

0 голосов
/ 17 августа 2010

Ваш код отлично работает для меня.У вас есть настройка страницы Application.cfm для включения управления сеансом, а именно:

<cfapplication name="#hash(getCurrentTemplatePath())#"  
    sessiontimeout="#createTimeSpan(0,0,20,0)#" sessionmanagement="true"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...