|
|
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Не понятно почему, но при запуске программы через компилятор всё работает нормально, а при запуске exe'шника во время обработки данных (в цикле запросы через ADOQuery к Access и Progressbar.Position:=i;) частенько GUI "зависает" на 1/10 Progressbar'a. Программа "Не отвечает", хотя обработка выполняется. Неужели, единственное решение, это отдельный поток для обработки? Мне не нужно во время выполнения кода взаимодействовать с GUI, только обновлять Progressbar. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 06:14 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Progress-бар не отрисуется, пока код не выполнится до конца (основной поток занят выполнением). Чтобы отрисовать, надо в процессе долгой операции вызвать Application.ProcessMessages (̶г̶у̶с̶а̶р̶ы̶ любители потоков, молчать:-) ), что позволит "высвободить GUI" и обработать ожидающие команды типа отрисовки нового значения прогресс бара или нажатия на кнопки (так что с последним надо быть аккуратнее и отключать перед выполнением). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 06:30 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Михаил Евгеньевич, Вас пугает многопоточность и вы хотите об этом поговорить? Многопоточность делается сейчас несколькими строками кода или компонентами вообще без строчки кода (штуки 3 навскидку назову). Пробуйте, там всё просто. Не элементарно, но просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 07:15 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
makhaon, Меня не пугает многопоточность. Просто спросил нормально ли это и почему это происходит? И можно ли обойтись без многопоточности. Действительно ли нельзя обновлять Progressbar внутри основного потока? Нажимаем кнопку, запускается цикл Код: pascal 1. 2. Это нормально. а Код: pascal 1. 2. 3. 4. 5. уже приводит к зависанию GUI. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 07:27 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Михаил Евгеньевич, Код: pascal 1. 2. 3. 4. 5. 6. Ну и самое главное - это узнать, на чем же подвисает главный поток, что бы дальше разбираться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 07:31 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Михаил Евгеньевич Код: pascal 1. 2. 3. 4. 5. уже приводит к зависанию GUI. Сначала выполнится {1}, а затем {2}. Если {1} довольно длителен по времени, то задержка отрисовки {2} уже заметна на глаз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 08:19 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Михаил Евгеньевич, попробуй такой код Код: pascal 1. 2. 3. 4. 5. затем поиграйся с аргументом функции sleep. И поймешь, в чем дело ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 08:22 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Михаил Евгеньевича Код: pascal 1. 2. 3. 4. 5. уже приводит к зависанию GUI. В 1-м ответе объяснили, почему это приведет к "зависанию". Потому, что во всём этом цикле никто не собирается обрабатывать WM_PAINT. Думаю, с минимальными изменениями если, добавь в цикл Код: pascal 1. если такое есть или сразу (точно есть) Код: pascal 1. Это частично поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 10:01 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
ДокМихаил Евгеньевич, попробуй такой код Код: pascal 1. 2. 3. 4. 5. затем поиграйся с аргументом функции sleep. И поймешь, в чем дело Код не пробовал с телефона пишу. По идее этот код должен так же "зависать", как и у ТС. Док, возможно, если ты это на Лазаре написал, там могли впихнуть и Update, а не только Invalidate, внутрь "Position:=". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 10:06 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
YuRock, Спасибо! Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 10:10 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Zelius Код: pascal 1. Это так себе способ перерисовать конкретное окно. Недостатки: 1. Обработаются все накопившиеся сообщения, что долго и в данном случае не нужно; 2. Самое главное. После InvalidateRect (которая будет вызвана при изменении прогрессбара) далеко не всегда делается посылка WM_PAINT: The system sends a WM_PAINT message to a window whenever its update region is not empty and there are no other messages in the application queue for that window. Поэтому это может просто не помочь. Для этого случая существует специальная функция - UpdateWindow. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 10:19 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
YuRock, Код: pascal 1. 2. 3. 4. 5. 6. 7. Подвисает, но почти в конце цикла. Код: pascal 1. 2. 3. 4. 5. 6. 7. Не подвисает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 10:34 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Для экспериментов. Код: pascal 1. Зависает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 10:38 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Михаил Евгеньевич Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Для экспериментов. Код: pascal 1. Зависает.Всё именно так и должно работать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 11:07 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Михаил Евгеньевич, так и должно быть. если у тебя do_something делается 100 миллисекунд и больше, готовься к тормозам. ну или делай сразу нормально, то есть с потоками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 11:54 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Михаил Евгеньевич Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Для экспериментов. Код: pascal 1. Зависает. Зависать может что-то другое, но не прорисовка прогрессбара при Progressbar1.Update. В отличие от прорисовки путем выкрутки сообщений (которых может еще и не быть). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 12:36 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Михаил Евгеньевич, т.ч. НЕ ВЕРЮ (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 12:37 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
YuRock, "Зависает" всё приложение. Вместе с прогрессбаром. В диспетчере задач "Не отвечает". Прогресс бар не движется. Код выполняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 12:56 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Михаил Евгеньевич, если в программе ADO, то попробуйте асинхронное соединение и выполнение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 13:11 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
progressbar.update решит вопрос Прогресс не движется но если окно перекрыть другим окном, то останется только один прогрессбар если написать форме update то все будет перерисовываться но все равно "висеть". ибо "висение" суть "нереакция на клаву/мышь" если написать Application.ProcessMessage, то все начнет двигаться, но заодно будут вызваться и другие обработчики, что может привести даже и к новому входу и в этот же обработчик и другим спецэффектам... т.е. побочка при лечении может быть и страшнее самой болезни. так что нормальный вариант это именно вынос долгих кусков в отдельный поток ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 13:16 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Михаил ЕвгеньевичYuRock, "Зависает" всё приложение. Вместе с прогрессбаром. В диспетчере задач "Не отвечает". Прогресс бар не движется. Код выполняется. А, понятно, это в XP и в 7-ке такой баг был, когда винда запоминала картинку окна и не перерисовывала её даже при корректной перерисовке, пока не обработаешь какое-то там сообщение. В 10-ке пофиксили наконец-то вроде - у меня такое не повторяется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 13:23 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Посмотрите AsyncCalls + TaskEx. Можно прямо по тексту программы практически ничего не меняя убрать часть кода в отдельный тред, а в основном просто сделаете свой прогресс. Я так сделал, правда у меня в основном потоке форма с анимационных гифом показывается, но прицип тот же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 13:41 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
кстати AsyncCalls на x64 работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 13:52 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
krapotkinтак что нормальный вариант это именно вынос долгих кусков в отдельный поток Ну это понятно, но ТС не хочет Михаил ЕвгеньевичНеужели, единственное решение, это отдельный поток для обработки? Мне не нужно во время выполнения кода взаимодействовать с GUI Ведь это же чудесно, что не нужно. Значит никаких проблем при вынесении логики в отдельный поток вообще не будет. Михаил Евгеньевичтолько обновлять Progressbar 1-й вариант: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 2-й вариант: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. В обоих вариантах можно SendMessage заменить на PostMessage, если на самом деле нет необходимости в мгновенной синхронной перерисовке. И еще нюанс. Если во время выполнения потока изменится Handle формы (это может произойти, например, при изменении BorderStyle) - то, конечно, все поламается (сообщения перестанут отправляться и интерфейс обновляться соответственно тоже). Но это лучше, чем отгрести полный крах при использовании в потоке Form1.Handle в этот момент. Т.ч. если надумаешь "сильно" менять интерфейс - останови вначале этот поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 13:59 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
rgreat, Сам лично не проверял, но написано Supported compilers: Delphi 5 to 10.1 Supported platforms: Win32, Win64 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 15:22 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Самый простой, пример кода - который демонстрирует, удобство использования потоков Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 16:29 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
А вот так, создавать анонимные потоки. Не связывая с внешным потоком Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 16:32 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Няшиккоторый демонстрирует, удобство использования потоковЗапускать пробовал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 17:15 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
YuRockКод не пробовал с телефона пишу. По идее этот код должен так же "зависать", как и у ТС. Док, возможно, если ты это на Лазаре написал, там могли впихнуть и Update, а не только Invalidate, внутрь "Position:=". я про sleep написал, потому что это наиболее близкая и понятная аналогия его do_something :) В Лазаре все устроено абсолютно точно также, как и внутри Дельфей. Поэтому, без многопоточности здесь не обойтись, как бы ТС не пытался избежать понимания этого :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 17:15 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, На Токио всё работает. А что??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 17:16 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Для лазура Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 17:20 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
НяшикНа Токио всё работает. А что???Пытаюсь уразуметь смысл вызова Synchronize из главного потока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 17:20 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Это просто два примера - лёгких. Которые демонстрируют, что страшные ленты потоков остались в прошлом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 17:37 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
НяшикЭто просто два примераЭти два примера - идиотские. Первый вызывает Syncrinize в главном потоке, хотя четко же написаноWarning: Do not call Synchronize from within the main thread. This can cause an infinite loop. Второй создает новый поток и из него обращается с свойствам VCL-объектов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 17:48 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Михаил Евгеньевич, win 10 FaCkingUpdate? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 17:57 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
НяшикСамый простой, пример кода - который демонстрирует, удобство использования потоков Кроме того, что сказал Василиск, хочу отметить еще одно. Всё это "удобство" улетает в трубу, когда необходимо завершить поток. А иметь возможность завершать потоки вручную (а не дожидаясь, пока он сам закончится) необходимо практически всегда, как показывает практика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 18:11 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Няшикчто страшные ленты потоков остались в прошлом Да, предыдущее моё сообщение - как раз про отсутствие "страшных лент". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 18:12 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Вот вам пример с кнопками старт и стоп. И всё работает - обращение к компонентам нормально. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. YuRock, Посмотри как реализован CreateAnonymousThread. Он заменяет и твою ленту ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 18:43 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Я хочу подметить один факт - Потоки не надо создавать бесконечно. Достаточно 1 - 5 ... Пусть живут всю программу, и с ними работаем. И не важно, создался ли новый класс этот анонимный. Вы такой же класс пишите ручками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 18:46 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Забыл в пример добавить завершение для формы Код: pascal 1. 2. 3. 4. 5. Но опять - же, две строчки.. И поток убит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 18:51 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
НяшикИ всё работает - обращение к компонентам нормально. 1. Работает случайно, пока везёт (обращения к объектам-компонентам ни разу не синхронизированы); 2. Работает только один раз (Resume и Suspend не помогут начать сначала). НяшикYuRock, Посмотри как реализован CreateAnonymousThread. Он заменяет и твою ленту Мне негде посмотреть, но мне хватило доку почитать, чтобы понять, что он FreeOnTerminate-only (как я и ожидал), а значит практически всегда не пригоден для использования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 18:58 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
НяшикЗабыл в пример добавить завершение для формы Код: pascal 1. 2. 3. 4. 5. Но опять - же, две строчки.. И поток убит удивительная способность делать простое сложным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 19:05 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Няшик Код: pascal 1. 2. 3. 4. 5. Но опять - же, две строчки.. И поток убит Ты, похоже, никогда не программировал, используя несколько потоков, раз пишешь (да еще и советуешь) такое. Если б хоть раз попробовал - отпало бы желание прерывать свой код некорректно (в неизвестном месте). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 19:08 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Няшик, увы, всё не настолько просто. но в случае тс только один вызов синхронизировать нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 19:12 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
Докудивительная способность делать простое сложным Больше похоже на попытки рандомного программирования. Вызовы первых попавшихся под руку функций в случайном порядке, не парясь на счет того, что они делают и зачем нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 19:13 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
есть такой устоявшийся термин - "судорожное программирование" Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 19:17 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
вот, к слову, упомянутая либа: https://github.com/ahausladen/AsyncCalls Requirements Supported compilers: Delphi 5 to 10.1 Supported platforms: Win32, Win64 Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Я у себя из компонент использую жедаевский TJvThread. И самописанный TThreadTimer. Тут на форуме Wadman своё изобразил ещё :) Жедаевский довольно удобный. Кинул, OnExecute обработал. Синхронно поменял прогресс и забыл весь кошмар как жуткий сон. Синхронное продвижение прогресса: TThread.Synchronize, TThread.Queue, SendMessage, PostMessage, можно выбрать, любой будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 19:20 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
НяшикНо опять - же, две строчки.. И поток убитУверен? А спорим, что нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 19:57 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
makhaon, Я правильно понял, что `TAsyncCalls.VCLSync()` будет ждать исполнения ShowMessage() в основном потоке, а основной поток в этот момент будет ждать завершения `TAsyncCalls.Invoke()` на строчке Код: pascal 1. ?.. Т.е. программа тупо зависнет? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 20:29 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
НяшикСамый простой, пример кода - который демонстрирует, удобство использования потоков Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. зачот!!!!!!!!!!!!! добавлю к задачам "найди и расскажи ..." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 20:56 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
alekcvp, как я понимаю, не тупо зависнет :) а будет ждать нажатия (иначе - смысл?). Впрочем - можно взять попробовать, там один файл всего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 21:12 |
|
||
|
Зависание GUI
|
|||
|---|---|---|---|
|
#18+
вот как выглядит кусок кода с использованием asynccalls+taskex, такое оформление мне понравилось именно простым способом завернуть код в дочерний поток, в данном примере датасет открывается в потоке, а в основном потоке работает WaitShow представляющий собой вызов формы с анимационным гифом. Код меняется минимально и его читаемость остается на приличном уровне. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2018, 07:35 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2041301]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
198ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
83ms |
get tp. blocked users: |
1ms |
| others: | 294ms |
| total: | 620ms |

| 0 / 0 |
