pie.o.my00 Опубликовано 1 апреля, 2019 Поделиться Опубликовано 1 апреля, 2019 Hi, Delphi Rio Android application.processMessages; dosent work. ProgressBar1.Value:=0; ProgressBar1.Max:=100; for I := 0 to 100 do begin ProgressBar1.Value:=I; application.ProcessMessages; sleep(100); end; trying this but progressbar not update position. any alternative way? Цитата Ссылка на комментарий
0 GASCHE Опубликовано 1 апреля, 2019 Поделиться Опубликовано 1 апреля, 2019 (изменено) procedure TForm1.Timer1Timer(Sender: TObject); begin ProgressBar1.Value:=I; IF I = 100 THEN Timer1.Enabled := False; Inc( I ); end; Изменено 1 апреля, 2019 пользователем GASCHE Цитата Ссылка на комментарий
0 Yarpda Опубликовано 2 апреля, 2019 Поделиться Опубликовано 2 апреля, 2019 17 часов назад, GASCHE сказал: procedure TForm1.Timer1Timer(Sender: TObject); begin ProgressBar1.Value:=I; IF I = 100 THEN Timer1.Enabled := False; Inc( I ); end; Это очень интересная альтернатива... Я бы сказал совсем альтернативная. )) Цитата Ссылка на комментарий
0 GASCHE Опубликовано 2 апреля, 2019 Поделиться Опубликовано 2 апреля, 2019 1 час назад, Yarpda сказал: Это очень интересная альтернатива... Я бы сказал совсем альтернативная. А чем эта хуже application.ProcessMessages? Цитата Ссылка на комментарий
0 Yarpda Опубликовано 2 апреля, 2019 Поделиться Опубликовано 2 апреля, 2019 10 минут назад, GASCHE сказал: А чем эта хуже application.ProcessMessages? Ну в 10.3 как раз ничем не хуже. Точно также не будет работать. Как я понимаю, не нужно просто пробежаться от 0 до 100 в прогрессбаре. Тут приведен просто пример, а на самом деле же нужно выполнять какой-то код в программе, который будет вместо sleep(100), а если это делать, то все встанет колом едва запустившись. И там уже не до progressbar будет, потому что цикл в зависимости значения таймера пойдет как попало. В общем это решения ОЧЕНЬ спорное на мой взгляд. Barbanel и Brovin Yaroslav 2 Цитата Ссылка на комментарий
0 GASCHE Опубликовано 3 апреля, 2019 Поделиться Опубликовано 3 апреля, 2019 14 часов назад, Yarpda сказал: Тут приведен просто пример, а на самом деле же нужно выполнять какой-то код в программе, который будет вместо sleep(100), а если это делать, то все встанет колом едва запустившись. Ну извините я не Кашпировский чтобы догадаться какой код нужно выполнять вместо sleep(100), и естественно на болванку я предложил такую же болванку. Как реально все это синхронизировать это дело автора вопроса если он захочет этим воспользоваться. У меня весь "sleep(100)" работает в потоке, проблем с синхронизацией нет. 14 часов назад, Yarpda сказал: В общем это решения ОЧЕНЬ спорное на мой взгляд. Предложите своё и, если оно будет проще непременно им воспользуюсь. Цитата Ссылка на комментарий
0 krapotkin Опубликовано 3 апреля, 2019 Поделиться Опубликовано 3 апреля, 2019 21 час назад, Yarpda сказал: Точно также не будет работать. замечательно будет работать начиная с D7 ))) это самый близкий аналог исходного цикла если будут вопросы по распараллеливанию, то это совсем другие вопросы Цитата Ссылка на комментарий
0 GASCHE Опубликовано 3 апреля, 2019 Поделиться Опубликовано 3 апреля, 2019 (изменено) В 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) можно выполнять любой код. Изменено 3 апреля, 2019 пользователем GASCHE Цитата Ссылка на комментарий
0 krapotkin Опубликовано 3 апреля, 2019 Поделиться Опубликовано 3 апреля, 2019 Timer1.Enabled := False; ... Timer1.Enabled := True; это намекает что автор какбе не верит в однопоточность ))) и думает, что волшебные силы могут что-то делать с таймером в то время пока выполняется этот кусок кода )))) Цитата Ссылка на комментарий
0 #WAMACO Опубликовано 3 апреля, 2019 Поделиться Опубликовано 3 апреля, 2019 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 krapotkin Опубликовано 3 апреля, 2019 Поделиться Опубликовано 3 апреля, 2019 (изменено) я искренне недоумеваю, почему у меня не "встает колом" ))) возраст видимо? 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; Изменено 3 апреля, 2019 пользователем krapotkin Цитата Ссылка на комментарий
0 #WAMACO Опубликовано 3 апреля, 2019 Поделиться Опубликовано 3 апреля, 2019 (изменено) 34 минуты назад, krapotkin сказал: я искренне недоумеваю, почему у меня не "встает колом" ))) возраст видимо? 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) (длительная операция имеется ввиду)? Изменено 3 апреля, 2019 пользователем #WAMACO Цитата Ссылка на комментарий
0 krapotkin Опубликовано 3 апреля, 2019 Поделиться Опубликовано 3 апреля, 2019 колом - это значит выполнение долгой операции в том же потоке. например sleep(1000) вы вернитесь в начало. там Processmessages стоит. оно знаете ли тоже отдельных потоков не запускает/ вопрос был чем заменить ProcessMessages а не как использовать потоки ответов на второй вопрос полно. и на этом форуме в том числе совсем недавно писал очередной тред Цитата Ссылка на комментарий
0 Yarpda Опубликовано 4 апреля, 2019 Поделиться Опубликовано 4 апреля, 2019 (изменено) Я смотрю вы знаете толк в извращениях... А ну ка просветите меня темного как эти таймеры использовать в такой конструкции: while Query.Eof = false do begin mf.label.text = query.fiеlds[0].asstring; application.processmessages; [.... делаем что-то, где срок выполнения задачи может быть разным] Query.next; end; Задача - чтобы пользователь видел на главной форме Label изменяющийся каждый раз когда переходит к следующей строке запроса. Повторюсь, без потоков, а так как писали выше при помощи хитрых таймеров. Изменено 4 апреля, 2019 пользователем Yarpda Нашел орф.ошибку Цитата Ссылка на комментарий
0 krapotkin Опубликовано 4 апреля, 2019 Поделиться Опубликовано 4 апреля, 2019 Раньше, когда телевизоры были ламповыми, многие "чинили" их, долбая по корпусу до тех пор, пока немного окислившиеся ножки лампы чуть смещались в цоколе, контакт на недолгое время восстанавливался, и телек опять показывал. Но даже они не долбают севременные плоские панели. сама задача видеть "пробегание" в label даже в Windows решается не процессингом всех сообщений, а простым Form.Update. Или Label.Update. Правило никто не отменял - если вы делаете что-то у чего есть "срок выполнения", ваша задача должна решаться потоками. что еще-то непонятно? ProcessMessages это только и исключительно костыль для ленивого программиста. Плохая практика рано или поздно всегда приводит к выстрелу в ногу. Подробнее я писал об этом тут. http://www.cyberforum.ru/blogs/469693/blog4909.html Могу привести пример очень большой программы, которая используется в одной федеральной сети, и сейчас там идет авральная работа - вдруг появились ошибки и зависания. А вызваны они таким же отношением к архитектуре. Там тоже наваяли ProcessMessages и других "быстрых решений" и сейчас расплакиваются по полной. А это правда ОЧЕНЬ большая программа... Возвращаясь к началу моего пламенного спича - в Андроид-программе после совмещения главного потока с потоком JVM просто нет нужного вам механизма обработки сообщений, так что долбать кулаком бесполезно. Цитата Ссылка на комментарий
0 GASCHE Опубликовано 4 апреля, 2019 Поделиться Опубликовано 4 апреля, 2019 10 часов назад, krapotkin сказал: это намекает что автор какбе не верит в однопоточность ))) и думает, что волшебные силы могут что-то делать с таймером в то время пока выполняется этот кусок кода )))) Верю, но думаю что таймер работает в отдельном потоке и по завершению заданного периода времени из него вызывается функция Timer1Timer, но не уверен что при этом происходит синхронизация с основным потоком,. Цитата Ссылка на комментарий
0 krapotkin Опубликовано 4 апреля, 2019 Поделиться Опубликовано 4 апреля, 2019 нет. все, что происходит в обработчике, происходит в главном потоке, и не прерывается ничем. Вспомните учебник. Ни один поток не имеет прав лазить к компонентам без синхронизации. Потому что это и так с гарантией убъет вашу программу Цитата Ссылка на комментарий
0 Yarpda Опубликовано 4 апреля, 2019 Поделиться Опубликовано 4 апреля, 2019 Ну то есть нельзя этим заменить ProcessMessages. Чего и следовало доказать. Я лишь выступал против того, что приведенный пример это далеко не аналог PM. Вот и все что я хотел сказать. Цитата Ссылка на комментарий
0 GASCHE Опубликовано 4 апреля, 2019 Поделиться Опубликовано 4 апреля, 2019 37 минут назад, krapotkin сказал: нет. все, что происходит в обработчике, происходит в главном потоке, и не прерывается ничем. Вспомните учебник. Ни один поток не имеет прав лазить к компонентам без синхронизации. Согласен. Цитата Ссылка на комментарий
0 GASCHE Опубликовано 4 апреля, 2019 Поделиться Опубликовано 4 апреля, 2019 1 час назад, Yarpda сказал: [.... делаем что-то] А это что значит? Делает программа или пользователь что-то меняет? Цитата Ссылка на комментарий
0 Yarpda Опубликовано 4 апреля, 2019 Поделиться Опубликовано 4 апреля, 2019 4 минуты назад, GASCHE сказал: А это что значит? Делает программа или пользователь что-то меняет? Конечно программа. Обрабатывает данные каким-то образом. Цитата Ссылка на комментарий
0 krapotkin Опубликовано 4 апреля, 2019 Поделиться Опубликовано 4 апреля, 2019 Если это непродолжительное чтото, то все ровно так оставить и будет работать. Если нет, то см выше Цитата Ссылка на комментарий
0 GASCHE Опубликовано 4 апреля, 2019 Поделиться Опубликовано 4 апреля, 2019 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 GASCHE Опубликовано 4 апреля, 2019 Поделиться Опубликовано 4 апреля, 2019 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 Yarpda Опубликовано 4 апреля, 2019 Поделиться Опубликовано 4 апреля, 2019 Даже не знаю как прокомментировать... В общем я думаю, что свою позицию я высказал. Применять ли Ваш код, взамен PM пусть уже решают участники форума. Цитата Ссылка на комментарий
0 #WAMACO Опубликовано 4 апреля, 2019 Поделиться Опубликовано 4 апреля, 2019 (изменено) 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; не получается? В общем пришли и "накостыляли" тут всем, своим кодом! Изменено 4 апреля, 2019 пользователем #WAMACO Цитата Ссылка на комментарий
Вопрос
pie.o.my00
Hi,
Delphi Rio Android application.processMessages; dosent work.
trying this but progressbar not update position.
any alternative way?
Ссылка на комментарий
25 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.