View Issue Details

IDProjectCategoryView StatusLast Update
0001852WishesMacropublic2013-02-03 00:33
ReporterDAtaMan Assigned Tovskirdin  
PrioritynormalSeverityfeatureReproducibilityhave not tried
Status closedResolutionfixed 
Product Version3.0 
Fixed in Version3.0 
Summary0001852: Макрокоманда Timer
DescriptionСлужит для получения текущего значения счётчика производительности в миллисекундах
Additional InformationСинтаксис: Timer([Type])
где Type - тип используемого счётчика
0 (по-умолчанию) - используется GetTickCount
1 - используются QueryPerformance*
TagsNo tags attached.
Build2150

Activities

DAtaMan

2011-08-14 13:04

reporter  

MacroTimer.diff (2,824 bytes)   
Index: macro.cpp
===================================================================
--- macro.cpp	(revision 6557)
+++ macro.cpp	(working copy)
@@ -348,6 +348,7 @@
 static bool stringFunc(const TMacroFunction*);
 static bool substrFunc(const TMacroFunction*);
 static bool testfolderFunc(const TMacroFunction*);
+static bool timerFunc(const TMacroFunction*);
 static bool trimFunc(const TMacroFunction*);
 static bool ucaseFunc(const TMacroFunction*);
 static bool usersFunc(const TMacroFunction*);
@@ -438,6 +439,7 @@
 	{L"STRING",           1, 0,   MCODE_F_STRING,           nullptr, 0,nullptr,L"S=String(V)",0,stringFunc},
 	{L"SUBSTR",           3, 1,   MCODE_F_SUBSTR,           nullptr, 0,nullptr,L"S=substr(S,start[,length])",0,substrFunc},
 	{L"TESTFOLDER",       1, 0,   MCODE_F_TESTFOLDER,       nullptr, 0,nullptr,L"N=testfolder(S)",0,testfolderFunc},
+	{L"TIMER",            1, 1,   MCODE_F_TIMER,            nullptr, 0,nullptr,L"N=Timer([Type])",0,timerFunc},
 	{L"TRIM",             2, 1,   MCODE_F_TRIM,             nullptr, 0,nullptr,L"S=Trim(S[,N])",0,trimFunc},
 	{L"UCASE",            1, 0,   MCODE_F_UCASE,            nullptr, 0,nullptr,L"S=UCase(S1)",0,ucaseFunc},
 	{L"WAITKEY",          2, 2,   MCODE_F_WAITKEY,          nullptr, 0,nullptr,L"V=Waitkey([N,[T]])",0,waitkeyFunc},
@@ -2147,6 +2149,25 @@
 	return !strKeyText.IsEmpty()?true:false;
 }
 
+// V=Timer([Type])
+static bool timerFunc(const TMacroFunction*)
+{
+	long Type=(long)VMStack.Pop().getInteger();
+	if (!Type)
+	{
+ 		VMStack.Push((__int64) GetTickCount());
+	}
+	else
+	{
+		__int64 Frequency, Counter;
+		QueryPerformanceFrequency((LARGE_INTEGER *) &Frequency);
+		QueryPerformanceCounter((LARGE_INTEGER *) &Counter);
+ 		VMStack.Push((Counter*1000)/Frequency);
+	}
+
+	return true;
+}
+
 // V=waitkey([N,[T]])
 static bool waitkeyFunc(const TMacroFunction*)
 {
Index: syslog.cpp
===================================================================
--- syslog.cpp	(revision 6557)
+++ syslog.cpp	(working copy)
@@ -1168,6 +1168,7 @@
 		DEF_MCODE_(F_SLEEP),
 		DEF_MCODE_(F_STRING),
 		DEF_MCODE_(F_SUBSTR),
+		DEF_MCODE_(F_TIMER),
 		DEF_MCODE_(F_UCASE),
 		DEF_MCODE_(F_WAITKEY),
 		DEF_MCODE_(F_XLAT),
Index: macroopcode.hpp
===================================================================
--- macroopcode.hpp	(revision 6557)
+++ macroopcode.hpp	(working copy)
@@ -190,6 +190,7 @@
 	MCODE_F_SLEEP,                    // Sleep(N)
 	MCODE_F_STRING,                   // S=string(V)
 	MCODE_F_SUBSTR,                   // S=substr(S,start[,length])
+	MCODE_F_TIMER,                    // S=Timer([Type])
 	MCODE_F_UCASE,                    // S=ucase(S1)
 	MCODE_F_WAITKEY,                  // V=waitkey([N,[T]])
 	MCODE_F_XLAT,                     // S=xlat(S)
MacroTimer.diff (2,824 bytes)   

DAtaMan

2011-08-14 13:05

reporter   bugnote:0007446

Ещё и RDTSC, наверное, будет лишним? :)

DrKnS

2011-08-14 14:32

administrator   bugnote:0007447

А зачем ветка с GetTickCount()?

DAtaMan

2011-08-14 14:50

reporter   bugnote:0007448

Да тоже думал её убрать, потом оставил для "комплекта".

DAtaMan

2011-08-14 15:05

reporter   bugnote:0007449

Может отсчёт вести со времени запуска Far?

DrKnS

2011-08-14 15:15

administrator   bugnote:0007450

А смысл?

DAtaMan

2011-08-14 15:41

reporter   bugnote:0007451

Если запоминать Counter до загрузки плагинов/макросов, то для бенчмарка загрузки, например.

DrKnS

2011-08-14 15:44

administrator   bugnote:0007452

логично.

DAtaMan

2011-08-14 16:49

reporter   bugnote:0007453

Если развить идею, можно иметь на борту уже запомненные тайминги.
Тогда можно сделать так:
Timer() - возвращает RunningTime
Timer(1) - время загрузки конфигурации
Timer(2) - -"-"-"-"-"-"-"- плагинов
Timer(3) - -"-"-"-"-"-"-"- макросов
Timer(4) - -"-"-"-"-"-"-"- историй
...
Каждый шаг таймировать, это конечно перебор, но важные участки можно было бы.

DrKnS

2011-08-14 17:08

administrator   bugnote:0007454

Макросы как бы для пользователей.
Зачем это всё _пользователю_?
Столь тонкие моменты должны волновать лишь разработчиков.

DAtaMan

2011-08-14 17:57

reporter   bugnote:0007455

А в баг-репортах не пригодится?
Если какое-то из времён слишком велико - ССЗБ.

DrKnS

2011-08-14 18:11

administrator   bugnote:0007456

Для багрепортов есть far /p и far /m.
Это всяко проще, чем заставлять пользователя писать и исполнять макросы :)

В конфиге тормозить нечему, а истории сейчас в бд и загружаются при необходимости, а не сразу.

DAtaMan

2011-08-14 18:58

reporter   bugnote:0007457

Логично. :)

Тогда, наверное, стоит переименовать функцию в RunningTime и избавиться от GetTickCount.
Может и другие мнения будут. Завтра. :)

DAtaMan

2011-08-15 06:59

reporter  

MacroTimer2.diff (3,400 bytes)   
Index: macro.cpp
===================================================================
--- macro.cpp	(revision 6562)
+++ macro.cpp	(working copy)
@@ -119,6 +119,7 @@
 	{2,  L"Far.Width",          MCODE_V_FAR_WIDTH,0},
 	{2,  L"Far.Height",         MCODE_V_FAR_HEIGHT,0},
 	{2,  L"Far.Title",          MCODE_V_FAR_TITLE,0},
+	{2,  L"Far.Running",        MCODE_V_FAR_RUNNING,0},
 	{2,  L"MacroArea",          MCODE_V_MACROAREA,0},
 
 	{2,  L"ItemCount",          MCODE_V_ITEMCOUNT,0},  // ItemCount - ����� ��������� � ������ ������
@@ -458,6 +459,7 @@
 
 TVarTable glbVarTable;
 TVarTable glbConstTable;
+__int64 FarStartedCounter;
 
 static TVar __varTextDate;
 
@@ -1068,6 +1070,12 @@
 					Console.GetTitle(strFileName);
 					Cond=strFileName.CPtr();
 					break;
+				case MCODE_V_FAR_RUNNING:
+					__int64 Frequency, Counter;
+					QueryPerformanceFrequency((LARGE_INTEGER *) &Frequency);
+					QueryPerformanceCounter((LARGE_INTEGER *) &Counter);
+					Cond=((Counter-FarStartedCounter)*1000)/Frequency;
+					break;
 				case MCODE_V_MACROAREA:
 					Cond=GetSubKey(CtrlObject->Macro.GetMode());
 					break;
Index: syslog.cpp
===================================================================
--- syslog.cpp	(revision 6562)
+++ syslog.cpp	(working copy)
@@ -1275,6 +1275,7 @@
 		DEF_MCODE_(V_EDITORSELVALUE),
 		DEF_MCODE_(V_MENU_VALUE),
 		DEF_MCODE_(V_FAR_HEIGHT),
+		DEF_MCODE_(V_FAR_RUNNING),
 		DEF_MCODE_(V_FAR_TITLE),
 		DEF_MCODE_(V_FAR_WIDTH),
 		DEF_MCODE_(V_HEIGHT),
Index: macroopcode.hpp
===================================================================
--- macroopcode.hpp	(revision 6562)
+++ macroopcode.hpp	(working copy)
@@ -289,6 +289,7 @@
 	MCODE_V_FAR_WIDTH=KEY_MACRO_V_BASE,// Far.Width - ������ ���������� ����
 	MCODE_V_FAR_HEIGHT,               // Far.Height - ����� ���������� ����
 	MCODE_V_FAR_TITLE,                // Far.Title - ������ ��������� ���������� ����
+	MCODE_V_FAR_RUNNING,              // Far.Running - ���� ����� Far � ������������
 	MCODE_V_MACROAREA,                // MacroArea - �� ������ ������ �������
 
 	MCODE_V_APANEL_CURRENT,           // APanel.Current - �� ����� �� �������� ������
Index: macro.hpp
===================================================================
--- macro.hpp	(revision 6562)
+++ macro.hpp	(working copy)
@@ -344,3 +344,5 @@
 const wchar_t *eStackAsString(int Pos=0);
 
 inline bool IsMenuArea(int Area){return Area==MACRO_MAINMENU || Area==MACRO_MENU || Area==MACRO_DISKS || Area==MACRO_USERMENU || Area==MACRO_AUTOCOMPLETION;}
+
+extern __int64 FarStartedCounter;
\ No newline at end of file
Index: main.cpp
===================================================================
--- main.cpp	(revision 6562)
+++ main.cpp	(working copy)
@@ -64,6 +64,7 @@
 #include "console.hpp"
 #include "configdb.hpp"
 #include "palette.hpp"
+#include "macro.hpp"
 
 #ifdef DIRECT_RT
 int DirectRT=0;
@@ -392,8 +393,10 @@
 int _cdecl wmain(int Argc, wchar_t *Argv[])
 {
 	std::set_new_handler(nullptr);
+	QueryPerformanceCounter((LARGE_INTEGER *) &FarStartedCounter);
+
 	GetVersionEx(&WinVer);
-	
+
 	// Starting with Windows Vista, the system uses the low-fragmentation heap (LFH) as needed to service memory allocation requests.
 	// Applications do not need to enable the LFH for their heaps.
 	if(WinVer.dwMajorVersion<6)
MacroTimer2.diff (3,400 bytes)   

DAtaMan

2011-08-15 06:59

reporter   bugnote:0007458

Функция переделана в псевдопеременную Far.Running

vskirdin

2011-08-15 15:07

administrator   bugnote:0007459

может имеет смысл эту штуку обозвать Far.UpTime
ы?
Running - сразу наводит на мысль об ответе на бессмысленный вопрос "ФАР запущен?" :-)

DAtaMan

2011-08-15 16:01

reporter   bugnote:0007460

> может имеет смысл эту штуку обозвать Far.UpTime

Пожалуй, имеет.
Новый патч же не нужен? :-)

vskirdin

2011-08-15 18:05

administrator   bugnote:0007461

нет, не нужен

vskirdin

2011-08-15 18:25

administrator   bugnote:0007462

в каких единицах... что возвращает Far.UpTime?

DAtaMan

2011-08-16 03:27

reporter   bugnote:0007463

Миллисекунды.

2useven10

2011-08-16 04:49

developer   bugnote:0007464

Last edited: 2011-08-16 04:52

Если uptime и миллисекунды, зачем PerformanceCounter?
imho GetTickCounter() достаточно, и проблем будет меньше.
Если речь идёт о точном времени стартапа - тогда другое дело,
но в этом случае не надо сбрасывать точность до миллисекунд.

DAtaMan

2011-08-16 05:52

reporter   bugnote:0007465

> GetTickCounter() достаточно, и проблем будет меньше.
Каких проблем?

Изначально функция задумывалась для профайлинга макросов.
Да и на форуме были "хотелки" о таймере.

2useven10

2011-08-16 08:12

developer   bugnote:0007467

1. ф-я предназначена для измерения Коротких промежутков времени с большой точностью (точность 1 ms делает её полезность сомнительной).
2. (из MSDN) Remarks
On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL). To specify processor affinity for a thread, use the SetThreadAffinityMask function.
3. на некоторых системах при включении поверсэйва точность ф-и падает вместе с понижением частоты процессора (MS по-моему это не признаёт)...

DrKnS

2011-08-16 08:15

administrator   bugnote:0007468

> Если uptime и миллисекунды, зачем PerformanceCounter?
> imho GetTickCounter() достаточно, и проблем будет меньше

Потому что у GetTickCount() точность на уровне ± лапоть:

The resolution of the GetTickCount function is limited to the resolution of the system timer, which is typically in the range of 10 milliseconds to 16 milliseconds.

2useven10

2011-08-16 08:24

developer   bugnote:0007469

Last edited: 2011-08-16 15:02

timeGetTime / timeBeginPeriod -- не бесплатно, потери на повышении частоты перепланировки.
ps: я ничего не имею против использования QueryPerformanceCounter для замеров временных интервалов порядка нескольких секунд, но тогда надо использовать максимальную точность.

vskirdin

2011-08-16 08:50

administrator   bugnote:0007471

build 2150

DAtaMan

2011-08-16 12:18

reporter  

general.html.diff (4,748 bytes)   
Index: general.html
===================================================================
--- general.html	(revision 6572)
+++ general.html	(working copy)
@@ -106,11 +106,11 @@
   </tr>
   <tr>
     <td><a name="IsUserAdmin">IsUserAdmin</a></td>
-    <td>Far ������ ��� ���������������?</td>
+    <td>Far Manager ������ ��� ���������������?</td>
   </tr>
   <tr>
     <td><a name="Fullscreen">Fullscreen</a></td>
-    <td>FAR �������� � ������� ������?</td>
+    <td>Far Manager �������� � ������� ������?</td>
   </tr>
 
 </table>
@@ -129,19 +129,24 @@
   <tr>
     <td><a name="Far.Width">Far.Width</a></td>
     <td>Number</td>
-    <td>������ �������, � ������� �������� FAR Manager</td>
+    <td>������ �������, � ������� �������� Far Manager</td>
   </tr>
   <tr>
     <td><a name="Far.Height">Far.Height</a></td>
     <td>Number</td>
-    <td>����� �������, � ������� �������� FAR Manager</td>
+    <td>����� �������, � ������� �������� Far Manager</td>
   </tr>
   <tr>
     <td><a name="Far.Title">Far.Title</a></td>
     <td>String</td>
-    <td>������ ��������� ���������� ���� FAR</td>
+    <td>������ ��������� ���������� ���� Far Manager</td>
   </tr>
   <tr>
+    <td><a name="Far.UpTime">Far.UpTime</a></td>
+    <td>Number</td>
+    <td>������ ������� (� ������������) �������� Far Manager (��� ������� �� ������ ��������� �����)</td>
+  </tr>
+  <tr>
     <td><a name="Title">Title</a></td>
     <td>String</td>
     <td>��������� ������� ������</td>
@@ -545,7 +550,7 @@
           <td>%L</td>
           <td><p>�������, ��������� ��� ��������
             ����� � ���� ������ - ����������/�������.</p>
-            <p>FAR ���������� � ������ 2 ������ ������������:</p>
+            <p>Far Manager ���������� � ������ 2 ������ ������������:</p>
             <p>1) ���������� ����������� ����� � ���� ������</p>
             <p>2) �����������, ������������� ���������� �������
             ���������� (<code>LOCALE_USER_DEFAULT</code>)</p>
@@ -692,8 +697,8 @@
           <td>16-���� ������ �� OEM ���������</td>
         </tr>
       </table>
-      ���� �������� <var>format</var> �� ������, �� FAR ����� ���������� �������� ������ <code><span class="nobr">"%a %b %d %H:%M:%S %Z %Y"</span></code> (��.).
-      <!--���� �������� <var>format</var> �� ������, �� FAR ����� ���������� ��������
+      ���� �������� <var>format</var> �� ������, �� Far Manager ����� ���������� �������� ������ <code><span class="nobr">"%a %b %d %H:%M:%S %Z %Y"</span></code> (��.).
+      <!--���� �������� <var>format</var> �� ������, �� Far Manager ����� ���������� ��������
       ������ "%a&nbsp;%b&nbsp;%d&nbsp;%H:%M:%S&nbsp;%Z&nbsp;%Y" (��.).-->
       </td>
   </tr>
@@ -961,8 +966,8 @@
         <tr><td>3</td><td>��������� Windows Clipboard �� ���������� ����� ������; �������� <var>Value</var> �����������; � ����� ����� ��������� 0</td></tr>
         <tr><td>4</td><td>��������� ���������� ����� ������ � Windows Clipboard; �������� <var>Value</var> �����������; � ����� ����� ��������� 0</td></tr>
         <tr><td>5</td><td><p>����� ����� � ������� ������.</p>
-          <p>�� ������� � ������ ����������/������� ���� FAR �������� � ������� ������ Windows.</p>
-          <p>����� '<code>clip(5)</code>' �������� � ������� ������ ������� �������� ���������� ������� FAR �� ����� �/��� ����������� ������ ������ Windows.</p>
+          <p>�� ������� � ������ ����������/������� ���� Far Manager �������� � ������� ������ Windows.</p>
+          <p>����� '<code>clip(5)</code>' �������� � ������� ������ ������� �������� ���������� ������� Far Manager �� ����� �/��� ����������� ������ ������ Windows.</p>
           <p><var>Value</var> ����� �� ����� ��:</p>
           <table class="cont2 params lite tiny">
           <col class="value">
@@ -1164,7 +1169,7 @@
         <tr><th><var>Mode</var></th><th>��������</th></tr>
         <tr><td>0</td><td><p>������� ���������������������, ������� ������� <var>S</var>.</p>
           <p>���� <var>S</var> �������� ������������� �����, �� ��������������������� �������� �� �����.</p>
-          <p>FAR ����������� ���������������� <var>S</var>. ���� ��� �����, �� �������� ������� ������� ��������
+          <p>Far Manager ����������� ���������������� <var>S</var>. ���� ��� �����, �� �������� ������� ������� ��������
           � ������� ������� ���������������� <var>S</var>. ����� ��������� <var>S</var> ��������� ������ ���������� �������.</p>
           </td></tr>
         <tr><td>1</td><td>�������� ���������������������, ������� ������� <var>S</var>,
general.html.diff (4,748 bytes)   

DAtaMan

2011-08-16 12:21

reporter   bugnote:0007478

> тогда надо использовать максимальную точность
В макросах, микросекунды особого смысла, как бы не имеют

Приложил diff для Писания.
Попутно заменил Far/FAR на Far Manager (только в general.html)

JohnDoe

2011-08-16 14:18

updater   bugnote:0007479

>В макросах, микросекунды особого смысла, как бы не имеют
Спорно.
Допустим, макрос выполняется примерно 1 миллисекунду (а он, гипотетически, может вызываться и сто раз в секунду).

2useven10

2011-08-16 15:33

developer   bugnote:0007480

Ну это просто мнение, что меня смущает:
1) неудачное название - для классического uptime использовать QPC плохая идея,
за неделю разница с реальностью может быть достаточно велика.
2) совершенно незачем терять информацию (точность).

Как-то так: Far.WorkCounter() mksec...
(зы: это моё последнее выступление на эту тему :)

DAtaMan

2011-08-16 15:50

reporter   bugnote:0007481

Макрос
%a=Far.UpTime;
$Rep(1000)
$End
%b=Far.UpTime;
Print(%b-%a)

выполняется за 170-190 миллисекунд.
Делим на 1000 - трёх знаков после запятой разве недостаточно?

А зачем неделями держать Far запущенным? :)

JohnDoe

2011-08-16 16:49

updater   bugnote:0007482

>Делим на 1000 - трёх знаков после запятой разве недостаточно?
Вот-вот, об этом и речь: этих самых делений и хотелось бы избежать (если возможно).

>А зачем неделями держать Far запущенным? :)
А зачем его не держать запущенным?

vskirdin

2011-08-17 09:24

administrator   bugnote:0007483

че решили то?

DAtaMan

2011-08-17 10:41

reporter   bugnote:0007484

Да всё равно, лишь бы было.
Просто думаю, что если нет угрозы для жизни, то важность микросекунд для человека сильно преувеличена. :)

DAtaMan

2011-08-17 11:56

reporter   bugnote:0007485

> Вот-вот, об этом и речь: этих самых делений и хотелось бы избежать (если возможно).

Этим самым вы принуждаете других пользователей выполнять это самое деление.
Ведь в большинстве случаев будут использоваться только секунды, реже миллисекунды.

Можно реальный пример использования микросекунд в макросах?

JohnDoe

2011-08-17 12:19

updater   bugnote:0007486

Если бы только оно: само деление выполнить очень легко.
Мне не нравится танцы с запихиванием содержимого макроса в цикл.

Как вариант, возвращать в (милли)секундах, но с дробной частью.

DAtaMan

2011-08-17 12:55

reporter   bugnote:0007487

Last edited: 2011-08-17 12:56

> Как вариант, возвращать в (милли)секундах, но с дробной частью.

Тогда более логичными будут секунды с дробной частью? Устраивает?

JohnDoe

2011-08-17 13:38

updater   bugnote:0007488

Чтобы понять как лучше - надо вначале попользоваться, поэтому прошу рассматривать мои соображения не более чем информацию к размышлению.
Не исключено что и миллисекунд на практике окажется достаточно :-)

vskirdin

2011-08-28 12:31

administrator   bugnote:0007562

Удовлетворение полное?
Закрываем?

Issue History

Date Modified Username Field Change
2011-08-14 13:04 DAtaMan New Issue
2011-08-14 13:04 DAtaMan File Added: MacroTimer.diff
2011-08-14 13:05 DAtaMan Note Added: 0007446
2011-08-14 14:32 DrKnS Note Added: 0007447
2011-08-14 14:50 DAtaMan Note Added: 0007448
2011-08-14 15:05 DAtaMan Note Added: 0007449
2011-08-14 15:15 DrKnS Note Added: 0007450
2011-08-14 15:41 DAtaMan Note Added: 0007451
2011-08-14 15:44 DrKnS Note Added: 0007452
2011-08-14 16:49 DAtaMan Note Added: 0007453
2011-08-14 17:08 DrKnS Note Added: 0007454
2011-08-14 17:57 DAtaMan Note Added: 0007455
2011-08-14 18:11 DrKnS Note Added: 0007456
2011-08-14 18:58 DAtaMan Note Added: 0007457
2011-08-15 06:59 DAtaMan File Added: MacroTimer2.diff
2011-08-15 06:59 DAtaMan Note Added: 0007458
2011-08-15 15:07 vskirdin Note Added: 0007459
2011-08-15 16:01 DAtaMan Note Added: 0007460
2011-08-15 18:05 vskirdin Note Added: 0007461
2011-08-15 18:25 vskirdin Note Added: 0007462
2011-08-16 03:27 DAtaMan Note Added: 0007463
2011-08-16 04:49 2useven10 Note Added: 0007464
2011-08-16 04:52 2useven10 Note Edited: 0007464
2011-08-16 05:52 DAtaMan Note Added: 0007465
2011-08-16 08:12 2useven10 Note Added: 0007467
2011-08-16 08:15 DrKnS Note Added: 0007468
2011-08-16 08:24 2useven10 Note Added: 0007469
2011-08-16 08:24 2useven10 Note Edited: 0007469
2011-08-16 08:50 vskirdin Note Added: 0007471
2011-08-16 08:50 vskirdin Assigned To => vskirdin
2011-08-16 08:50 vskirdin Status new => feedback
2011-08-16 12:18 DAtaMan File Added: general.html.diff
2011-08-16 12:21 DAtaMan Note Added: 0007478
2011-08-16 12:21 DAtaMan Status feedback => assigned
2011-08-16 14:18 JohnDoe Note Added: 0007479
2011-08-16 15:02 2useven10 Note Edited: 0007469
2011-08-16 15:33 2useven10 Note Added: 0007480
2011-08-16 15:50 DAtaMan Note Added: 0007481
2011-08-16 16:49 JohnDoe Note Added: 0007482
2011-08-17 09:24 vskirdin Note Added: 0007483
2011-08-17 10:41 DAtaMan Note Added: 0007484
2011-08-17 11:56 DAtaMan Note Added: 0007485
2011-08-17 12:19 JohnDoe Note Added: 0007486
2011-08-17 12:55 DAtaMan Note Added: 0007487
2011-08-17 12:56 DAtaMan Note Edited: 0007487
2011-08-17 13:38 JohnDoe Note Added: 0007488
2011-08-28 12:31 vskirdin Note Added: 0007562
2011-08-28 12:31 vskirdin Status assigned => feedback
2012-06-08 14:47 DAtaMan Status feedback => resolved
2012-06-09 05:57 vskirdin Build => 2150
2012-06-09 05:57 vskirdin Status resolved => closed
2012-06-09 05:57 vskirdin Resolution open => fixed
2012-06-09 05:57 vskirdin Fixed in Version => 3.0
2013-02-03 00:33 alexy Severity minor => feature