Ошибки, баги, вопросы - страница 2436

Slava:

Всё правильно. Фрейм доступен при условии его добавки в mqd-файл. Именно оттуда он и вычитывается фреймовыми функциями

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

У меня такой проблемы не было. Библиотеку писал для доступа к фреймам в обычном режиме советника в Терминале.


Не разобрался, за что отвечают последние 16 байтов.

struct FRAME
{
  ulong Pass;
  long ID;
  short String[64];
  double Value;
  int SizeOfArray;
  long Tmp[2];
Slava:

Всегда надо дочитывать фреймы в OnTesterDeinit. Это как отче наш

Потом жалуются на пропажу фреймов

Впервые слышу про этот "отче наш". Где об этом сказано?   Разве OnTesterDeinit не должен вызываться после получения всех фрэймов в терминал? Или он может перескакивать через другие события (в частности OnTesterPass), находящиеся в очереди событий?  Если так, то это следовало бы прописать в документации, ибо это нетипичное поведение.

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

Alexey Navoykov:

Впервые слышу про этот "отче наш". Где об этом сказано?   Разве OnTesterDeinit не должен вызываться после получения всех фрэймов в терминал? Или он может перескакивать через другие события (в частности OnTesterPass), находящиеся в очереди событий?  Если так, то это следовало бы прописать в документации, ибо это нетипичное поведение.

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

OnTesterPass может запросто вызваться по окончанию прохода, но к этому моменту фрейм-данные прохода могут не дойти из-за неидеальности сети.

Когда народ говорит, что фреймы теряются, он чаще всего имеет в виду, что в OnTesterPass не все получилось поймать.

Так вот дополучить можно всегда в OnTesterDeinit, т.к. Оптимизатор на стороне Терминала прекращает свою работу не тогда, когда Агенты все посчитали, а когда дождался прихода всех фреймов.

fxsaber:

OnTesterPass может запросто вызваться по окончанию прохода, но к этому моменту фрейм-данные прохода могут не дойти из-за неидеальности сети.

Т.е. OnTesterPass вызывается без наличия фрэймов?  Ну тогда это очевидная ошибка.  Данное событие означает получение фрэйма, а не окончание прохода.

Все фрэймы должны придти в OnTesterPass до того, как вызывать событие OnTesterDeinit. Это нормальная здоровая логика.   Если, повторюсь, речь не идёт о принудительном прерывании тестирования.

Alexey Navoykov:

Т.е. OnTesterPass вызывается без наличия фрэймов?  Ну тогда это очевидная ошибка.  Данное событие означает получение фрэйма, а не окончание прохода.

Все фрэймы должны придти в OnTesterPass до того, как вызывать событие OnTesterDeinit. Это нормальная здоровая логика.   Если, повторюсь, речь не идёт о принудительном прерывании тестирования.

Видимо, я ошибся. Думал, что TesterPass-событие - поступление данных прохода

Core 1  pass 0 returned result 100000.00 in 0:00:00.433
Core 1  pass 1 returned result 100000.00 in 0:00:00.001
Core 1  pass 2 returned result 100000.00 in 0:00:00.001
Core 1  pass 3 returned result 100000.00 in 0:00:00.001
Кто бы opt-формат вскрыл...
Alexey Navoykov:

Т.е. OnTesterPass вызывается без наличия фрэймов?  Ну тогда это очевидная ошибка.  Данное событие означает получение фрэйма, а не окончание прохода.

Все фрэймы должны придти в OnTesterPass до того, как вызывать событие OnTesterDeinit. Это нормальная здоровая логика.   Если, повторюсь, речь не идёт о принудительном прерывании тестирования.

OnTesterPass вызывается, когда пришёл хотя бы один фрейм. Может прийти пачка фреймов. Поэтому в OnTesterPass надо принимать фреймы в цикле, а не по одному. Но если "после последнего раза - ни разу", то OnTesterPass не вызывается.

Оптимизация прекращается, когда пришёл последний результат. Фреймы могут поступить позднее, особенно если в фрейме передаётся большое количество данных или если передаётся сразу несколько фреймов на один проход. Поэтому в OnTesterDeinit, которая запускается по завершению оптимизации нужно организовывать приём оставшихся фреймов.  Тоже в цикле.

Это - нормальная здоровая логика.

Я несколько раз давал примеры приёма фреймов именно в OnTesterDeinit, а не только в OnTesterPass. И именно приём сложных фреймов разных типов

Slava:

если передаётся сразу несколько фреймов на один проход.

Когда-то пробовал, такое не прокатывало. Только один FrameAdd срабатывал.

Slava:

Оптимизация прекращается, когда пришёл последний результат. Фреймы могут поступить позднее, особенно если в фрейме передаётся большое количество данных или если передаётся сразу несколько фреймов на один проход. Поэтому в OnTesterDeinit, которая запускается по завершению оптимизации нужно организовывать приём оставшихся фреймов.  Тоже в цикле.

Если фрэймы могут поступить позднее, то значит нет гарантии, что и в OnTesterDeinit они будут сразу?  Т.е. надо делать цикл ожидания?  И как долго ждать?

Я то ранее подумал, что дело обстоит так:  OnTesterPass вызывается только для тех фрэймов, которые пришли с момент окончания предыдущего OnTesterPass.  Если же новый фрэйм пришёл в процессе выполнения OnTesterPass , а конкретней - с момента последнего вызова FrameNext и до завершения функции, то этот фрэйм так и останется висеть, пока не придёт новый фрэйм, генерирующий событие.   Поэтому OnTesterDeinit и необходим для получения этих висящих фрэймов.

Alexey Navoykov:

Если фрэймы могут поступить позднее, то значит нет гарантии, что и в OnTesterDeinit они будут сразу?  Т.е. надо делать цикл ожидания?  И как долго ждать?

Я то ранее подумал, что дело обстоит так:  OnTesterPass вызывается только для тех фрэймов, которые пришли с момент окончания предыдущего OnTesterPass.  Если же новый фрэйм пришёл в процессе выполнения OnTesterPass , а конкретней - с момента последнего вызова FrameNext и до завершения функции, то этот фрэйм так и останется висеть, пока не придёт новый фрэйм, генерирующий событие.   Поэтому OnTesterDeinit и необходим для получения этих висящих фрэймов.

FrameNext - это тупое чтение mqd-файла и больше ничего.

FrameFirst - FileSeek.