Перейти к содержанию
Fire Monkey от А до Я
  • 0

Delphi Rio Android application.processMessages; dosent work


pie.o.my00

Вопрос

Рекомендуемые сообщения

  • 0
17 часов назад, GASCHE сказал:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   ProgressBar1.Value:=I;  
   IF I = 100 THEN
      Timer1.Enabled := False;
   Inc( I ); 
end;

Это очень интересная альтернатива... Я бы сказал совсем альтернативная. ))

Ссылка на комментарий
  • 0
10 минут назад, GASCHE сказал:

А чем эта хуже application.ProcessMessages? 

Ну в 10.3 как раз ничем не хуже. Точно также не будет работать.

Как я понимаю, не нужно просто пробежаться от 0 до 100 в прогрессбаре.

Тут приведен просто пример, а на самом деле же нужно выполнять какой-то код в программе, который будет вместо sleep(100), а если это делать, то все встанет колом едва запустившись. И там уже не до progressbar будет, потому что цикл в зависимости значения таймера пойдет как попало. В общем это решения ОЧЕНЬ спорное на мой взгляд.

Ссылка на комментарий
  • 0
14 часов назад, Yarpda сказал:

Тут приведен просто пример, а на самом деле же нужно выполнять какой-то код в программе, который будет вместо sleep(100), а если это делать, то все встанет колом едва запустившись.

Ну извините я не Кашпировский чтобы догадаться какой код нужно выполнять вместо sleep(100), и естественно на болванку я предложил такую же болванку. Как реально все это синхронизировать это дело автора вопроса если он захочет этим воспользоваться. У меня весь "sleep(100)" работает в потоке, проблем с синхронизацией нет. 

 

14 часов назад, Yarpda сказал:

В общем это решения ОЧЕНЬ спорное на мой взгляд.

Предложите своё и, если оно будет проще непременно им воспользуюсь.

Ссылка на комментарий
  • 0
21 час назад, Yarpda сказал:

Точно также не будет работать.

замечательно будет работать начиная с D7 )))

это самый близкий аналог исходного цикла

если будут вопросы по распараллеливанию, то это совсем другие вопросы

Ссылка на комментарий
  • 0
В 02.04.2019 в 18:00, Yarpda сказал:

Тут приведен просто пример, а на самом деле же нужно выполнять какой-то код в программе, который будет вместо sleep(100), а если это делать, то все встанет колом

Чтоб не "встало колом" можно так ? 

procedure TForm1.Timer1Timer(Sender: TObject);
begin

   ProgressBar1.Value:=iI;
   Timer1.Enabled := False;
   Inc( iI );
   sleep(100);
   IF iI <= 100 THEN
      Timer1.Enabled := True;
end;
Вместо sleep(100) можно выполнять любой код.
 

Изменено пользователем GASCHE
Ссылка на комментарий
  • 0
Timer1.Enabled := False;
...
 Timer1.Enabled := True;

это намекает что автор какбе не верит в однопоточность  ))) и думает, что волшебные силы могут что-то делать с таймером в то время пока выполняется этот кусок кода ))))

Ссылка на комментарий
  • 0
2 часа назад, GASCHE сказал:

Чтоб не "встало колом" можно так ? 

procedure TForm1.Timer1Timer(Sender: TObject);
begin

   ProgressBar1.Value:=iI;
   Timer1.Enabled := False;
   Inc( iI );
   sleep(100);
   IF iI <= 100 THEN
      Timer1.Enabled := True;
end;
Вместо sleep(100) можно выполнять любой код.
 

попробовал ваш код, но "встало колом" ?

Ссылка на комментарий
  • 0

я искренне недоумеваю, почему у меня не "встает колом" ))) 

возраст видимо?

image.png.537445b8a5f3156962f34266c522e435.png

  public
    ind:integer;
  end;

var
  fMainForm: TfMainForm;

implementation

{$R *.dfm}

procedure TfMainForm.b1Click(Sender: TObject);
begin
  ind := 0;
  tmr1.enabled := true;
end;

procedure TfMainForm.tmr1Timer(Sender: TObject);
begin
  if ind=100 then
    tmr1.enabled := false
  else
  begin
    inc(ind);
    pb1.Position := ind;
  end;
end;

 

 

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0
34 минуты назад, krapotkin сказал:

я искренне недоумеваю, почему у меня не "встает колом" ))) 

возраст видимо?

image.png.537445b8a5f3156962f34266c522e435.png


  public
    ind:integer;
  end;

var
  fMainForm: TfMainForm;

implementation

{$R *.dfm}

procedure TfMainForm.b1Click(Sender: TObject);
begin
  ind := 0;
  tmr1.enabled := true;
end;

procedure TfMainForm.tmr1Timer(Sender: TObject);
begin
  if ind=100 then
    tmr1.enabled := false
  else
  begin
    inc(ind);
    pb1.Position := ind;
  end;
end;

 

 

так у вас и не "встанет колом", так как ничего и не делается! где sleep(1000) (длительная операция имеется ввиду)?

Изменено пользователем #WAMACO
Ссылка на комментарий
  • 0

колом - это значит выполнение долгой операции в том же потоке. например sleep(1000)

вы вернитесь в начало. там Processmessages стоит. оно знаете ли тоже отдельных потоков не запускает/

вопрос был чем заменить ProcessMessages а не как использовать потоки

ответов на второй вопрос полно. и на этом форуме в том числе совсем недавно писал очередной тред

Ссылка на комментарий
  • 0

Я смотрю вы знаете толк в извращениях... ;)

А ну ка просветите меня темного как эти таймеры использовать в такой конструкции:
 

while Query.Eof = false do begin
 mf.label.text = query.fiеlds[0].asstring;
 application.processmessages;

[.... делаем что-то, где срок выполнения задачи может быть разным]
Query.next;
end;

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

Повторюсь, без потоков, а так как писали выше при помощи хитрых таймеров.

Изменено пользователем Yarpda
Нашел орф.ошибку
Ссылка на комментарий
  • 0

Раньше, когда телевизоры были ламповыми, многие "чинили" их, долбая по корпусу до тех пор, пока немного окислившиеся ножки лампы чуть смещались в цоколе, контакт на недолгое время восстанавливался, и телек опять показывал. Но даже они не долбают севременные плоские панели.

сама задача видеть "пробегание" в label даже в Windows решается не процессингом всех сообщений, а простым Form.Update. Или Label.Update.

Правило никто не отменял - если вы делаете что-то у чего есть "срок выполнения", ваша задача должна решаться потоками. что еще-то непонятно?

ProcessMessages это только и исключительно костыль для ленивого программиста. Плохая практика рано или поздно всегда приводит к выстрелу в ногу. Подробнее я писал об этом тут. http://www.cyberforum.ru/blogs/469693/blog4909.html 

Могу привести пример очень большой программы, которая используется в одной федеральной сети, и сейчас там идет авральная работа - вдруг появились ошибки и зависания. А вызваны они таким же отношением к архитектуре. Там тоже наваяли ProcessMessages и других "быстрых решений" и сейчас расплакиваются по полной. А это правда ОЧЕНЬ большая программа...

Возвращаясь к началу моего пламенного спича - в Андроид-программе после совмещения главного потока с потоком JVM просто нет нужного вам механизма обработки сообщений, так что долбать кулаком бесполезно.

 

Ссылка на комментарий
  • 0
10 часов назад, krapotkin сказал:

это намекает что автор какбе не верит в однопоточность  ))) и думает, что волшебные силы могут что-то делать с таймером в то время пока выполняется этот кусок кода ))))

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

Ссылка на комментарий
  • 0

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

Ссылка на комментарий
  • 0

Ну то есть нельзя этим заменить ProcessMessages. Чего и следовало доказать. Я лишь выступал против того, что приведенный пример это далеко не аналог PM. Вот и все что я хотел сказать.

Ссылка на комментарий
  • 0
37 минут назад, krapotkin сказал:

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

Согласен.

Ссылка на комментарий
  • 0
9 часов назад, #WAMACO сказал:

так у вас и не "встанет колом", так как ничего и не делается! где sleep(1000) (длительная операция имеется ввиду)?

У меня так 

procedure TForm1.Timer1Timer(Sender: TObject);
VAR
   iJ : Integer;
begin
   ProgressBar1.Value:=iI;
   Label1.Text := iI.ToString ;
   //Timer1.Enabled := False;
   Inc( iI );
   //sleep(100);
   for iJ := 0 to 100000000 do
      LT := LT + 1;
   IF iI > 100 THEN
      Timer1.Enabled := False;
end;
не "встает" хоть sleep хоть FOR.

 

Ссылка на комментарий
  • 0
5 минут назад, Yarpda сказал:

Конечно программа.

А так

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   label1.text = query.fiеlds[0].asstring;
   [.... делаем что-то, где срок выполнения задачи может быть разным]

   IF NOT Query.Eof THEN
      Timer1.Enabled := False
   ELSE
      Query.next;
END;
не получается?

Ссылка на комментарий
  • 0
5 часов назад, GASCHE сказал:

А так

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   label1.text = query.fiеlds[0].asstring;
   [.... делаем что-то, где срок выполнения задачи может быть разным]

   IF NOT Query.Eof THEN
      Timer1.Enabled := False
   ELSE
      Query.next;
END;
не получается?

В общем пришли и "накостыляли" тут всем, своим кодом!  ???

Изменено пользователем #WAMACO
Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...