Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2016, 13:52   #1
gOsToFf
Новичок
Джуниор
 
Регистрация: 02.06.2009
Сообщений: 2
По умолчанию Вывод данных при рекурсии.

Здравствуйте. Есть задача снимать данные BT и выводить на экран. Собственно сама задача решена. Но есть проблема в том что нужно делать это циклично.

То бишь выглядит все так:

Код:

procedure TForm1.On_btImgClick(Sender: TObject);
begin
  On_BitAni.Enabled := TRUE;
  Tracking:= 1;
  repeat
      getData;
  until (Tracking <> 1);
end;

procedure TForm1.getData;
var
  searchMe:string;
  RegEx: TRegEx;
  Options: TRegExOptions;
  M: TMatchCollection;
  i,j:integer;
begin
  BTMethod.SendData( TargetPaireNo, '1' + #$15 );
  searchMe := BTMethod.ReadDataS( TargetPaireNo );
 //создаем объект
 RegEx:=TRegEx.Create('#(\w+):(\d+)?#',[roIgnoreCase,roMultiline]);
 if RegEx.IsMatch(searchMe)then
   begin
     M:=RegEx.Matches(searchMe,'#(\w+):(\d+)?#',[roIgnoreCase,roMultiline]);
     for  i:=0 to M.Count-1 do
       begin
           if (M.Item[i].Groups[1].Value =  'ENGRPM')
            then  begin
              TENGRPM.Text := M.Item[i].Groups[2].Value;
            end;
           if (M.Item[i].Groups[1].Value =  'ENGTEMP')
            then  begin
               TENGTEMP.Text := M.Item[i].Groups[2].Value;
            end;
           if (M.Item[i].Groups[1].Value =  'SCREWRPM')
            then  begin
               TSCREWRPM.Text := M.Item[i].Groups[2].Value;
            end;
           if (M.Item[i].Groups[1].Value =  'ENGPPS')
            then  begin
               TENGPPS.Text := M.Item[i].Groups[2].Value;
               TENGPPSBAR.Value := StrToInt( M.Item[i].Groups[2].Value );
            end;
           if (M.Item[i].Groups[1].Value =  'SCREWTEMP')
            then  begin
               TSCREWTEMP.Text := M.Item[i].Groups[2].Value;
            end;
           if (M.Item[i].Groups[1].Value =  'FUEL1LEFT')
            then  begin
               TFUEL1LEFT.Text := M.Item[i].Groups[2].Value;
            end;
           if (M.Item[i].Groups[1].Value =  'FUEL2LEFT')
            then  begin
               TFUEL2LEFT.Text := M.Item[i].Groups[2].Value;
            end;
       end;
   end;
end;
Нужно замкнуть процедуру - procedure TForm1.getData;

Но как бы я этого не делал ( while, repeat, вызов самой из себя ) ничего не получается. Приложение не отрабатывает ни разу ( не вижу данных ).
И в итоге вылетает.

Это RadStudio 10 ситл. И приложение под андроид.

Подскажите как решить данную проблему?

Потому что если я убираю все циклы и щелкаю кнопку постоянно все работает нормально.
gOsToFf вне форума Ответить с цитированием
Старый 24.01.2016, 16:05   #2
Terikon
Форумчанин
 
Регистрация: 22.02.2009
Сообщений: 174
По умолчанию

Попробуй запустить через отладчик, ошибку может выдаст

у тебя постоянно создаются объекты,сделай глобальными и выведи их отдельно
RegEx:=TRegEx.Create('#(\w+)\d+)? #',[roIgnoreCase,roMultiline]);

Последний раз редактировалось Terikon; 24.01.2016 в 16:14.
Terikon вне форума Ответить с цитированием
Старый 24.01.2016, 21:22   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Таймер пробовали ?

Насчёт создания и неудаления объектов регэкспа - я полагаю, оно не приводит к утечкам, т.к. на андроиде в дельфи есть автоматическое управление временем жизни объектов через ARC.
phomm вне форума Ответить с цитированием
Старый 24.01.2016, 22:29   #4
gOsToFf
Новичок
Джуниор
 
Регистрация: 02.06.2009
Сообщений: 2
По умолчанию

проблему решил переведя на отделение потоков.

Код:
procedure TForm1.On_btImgClick(Sender: TObject);
begin
  On_BitAni.Enabled := TRUE;
  Tracking := 1;
  TThread.CreateAnonymousThread(procedure ()
  begin
    while Tracking = 1 do begin
      TThread.Synchronize (TThread.CurrentThread,
      procedure ()
      begin
         getData;
      end);
    end;
  end).Start;
end;

Таймеры тоже пробовал. но проблему не решало.

По рекекспу, объявлен он внутри процедуры, поэтому он уничтожается после закрытия процедуры.

А теперь еще вопрос. Кто знает как сделать чтобы андроид не блокировал экран?)

Последний раз редактировалось gOsToFf; 24.01.2016 в 22:35.
gOsToFf вне форума Ответить с цитированием
Старый 25.01.2016, 00:15   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от gOsToFf Посмотреть сообщение
По рекекспу, объявлен он внутри процедуры, поэтому он уничтожается после закрытия процедуры.
Кто он? Не знаком ни с Seatle, ни с FMX. Но и ни разу не слышал чтобы в какой-либо версии Дельфи объекты (экземпляры классов) созданные внутри некой процедуры автоматически уничтожались бы при выходе из этой процедуры. Ссылка на них естественно теряется, но сами объекты живут своей жизнью вплоть до завершения процесса.
northener вне форума Ответить с цитированием
Старый 25.01.2016, 05:33   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

northener, читаем главу ARC тут www.gunsmoker.ru/2013/05/modern-delphi.html‎ (хоть речь и про хе4 , актуальную на момент создания статьи, но я гуглил, Марко Кэнту упоминает что для ондрюшки в хе5+ сделано то же самое)

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

Чтобы андроид не блокировал, имеется в виду блокировку экрана по прошествии отведённого времени, которое настроил пользователь или упаси б-г по кнопке выкл? Идея очень плохая, но должно быть можно, загляните на www.fmxexpress.com там много статей.

Последний раз редактировалось phomm; 25.01.2016 в 15:10.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод в массив из рекурсии yurgeno Общие вопросы C/C++ 5 23.04.2014 22:55
вывод в див имен из бд и при нажатии вывод в отдельный див дополнительной информации об этом имени / PHP и базы данных looni123 JavaScript, Ajax 3 03.04.2014 21:26
Вывод структуры дерева без рекурсии Alexander X Общие вопросы C/C++ 1 25.11.2013 20:59
автоматический вывод данных при вводе одного параметра Akmal-Sharipov Microsoft Office Excel 9 16.12.2010 16:13
Вывод данных из файла при запущенном приложении pautina Общие вопросы Delphi 20 27.01.2009 18:13