|
|
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Из-за частых запросов idhttp форма безбожно тормозит. Если я функцию из которой происходит вызов засуну в поток idhttp будет параллельно работать с несколькими соединениями? Если нет, как еще можно решить проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 17:48 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Насколько помню, Indy и так создаёт отдельный поток для обработки каждого http-запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 17:52 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
RWolf, Тогда почему форма зависает? Ожидает получения html кода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 18:46 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
IdHTTP1.Get() вызов блокирующий, не асинхронный вынести в поток и не мучиться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 21:04 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Проблема та же самая, чтобы не создавать новую тему: IdHTTP вызывается в отдельном потоке. Это функция, получающая цены с биржи Код: 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. Эта функция вызывается из потока. С помощью кода, который закомментирован, определил, что именно в этот момент (Result := Http_req.post(AURL, AParam);) иногда происходит "тормоз" основной формы. Проверял так: хватал форму за заголовок и крутил мышкой. Все работает как надо, но иногда (именно что не всегда) в момент idhttp.post форма подвисает как при выполнении длительной операции в основном потоке (и Memo рисует текст "виновной" за подвисание процедуры). Экспериментами выявил, что если отключить Касперского - глюк становится реже. И еще, в те моменты, когда форма подвисает, обычно возвращается api error : Read timed out. Как-то можно сделать чтобы все таки основная форма не тормозилась? это код потока Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2018, 11:55 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Devillio, SendMessage ожидает ответа PostMessage не ждет, а продолжает работу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2018, 12:02 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Сюзанна, это да. В самой функции SendMessage я ставил когда искал проблемное место (мемо в момент подвисания рисует виновника). В коде потока SendMessage отрабатывает за миллисикунды, там преобразование json в ini и просто запись в базу. Форма подвисает именно в момент IdHTTP.Post, но не всегда (повторяюсь), это 146% точно, вот только почему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2018, 13:03 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Devillio, скорее всего проблема в главном потоке в обработке сообщения WM_USER + 100 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2018, 13:29 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
DevillioКак-то можно сделать чтобы все таки основная форма не тормозилась? Использовать TIdAntiFreeze? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2018, 13:40 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Zelius, ну поверьте, ну нет же (( Для поиска проблемы, я обрамил все процедуры: в начале процедуры ставил вывод в Memo ее название, в конце - Memo очищается. Я вертел на мышке главную форму, и в основном все выполнялось плавно (все таблички на форме обновляли данные, а в мемо мимолетно проскакивали названия процедур), но иногда только одно название подвисало на нексолько секунд, в тот же момент висла и форма. Т.о. было найдено, что глючит именно функция, которая запрашивает текст с сайта. И когда это происходит, в базу пишется "api error: read timed out". Таким же методом я выяснил на какой строчке глючит, именно IdHttp.Post: // Когда ремарка снята, перед выполнением Post форма рисует в Memo название // DataInfo.ID := 1; DataInfo.IDCommand := umcUpdateDebugMemo; // DataInfo.InfoString := 'Yobit_api_public(AURL: String; var IsExcepted: Boolean): String;'; // SendMessage(Application.MainFormHandle, WM_USER + 100, 0, IntPtr(@DataInfo)); Result := Http_req.post(AURL, AParam); // DataInfo.ID := 1; DataInfo.IDCommand := umcUpdateDebugMemo; // DataInfo.InfoString := ''; // SendMessage(Application.MainFormHandle, WM_USER + 100, 0, IntPtr(@DataInfo)); При отключенном антивирусе заметно улучшается (глюки становятся реже, но не пропадают совсем. Уменьшение/увеличение параметра Timeout влияет на количество секунд тормоза. Пробовал поставить Timeout :=20000 - так форма и зависает, на порядка 20 секунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2018, 13:53 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Квейд, о, благодарю! Да, по описанию именно оно, положил на форму, как рекомендуют, но чет не помогло... Буду с ним экспериментировать, думаю это правильное направление )) Еще раз спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2018, 14:43 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
правильное направление выносить долгие операции в отдельный поток, а все остальное - расстановка грабелек по феншую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2018, 14:56 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Devillio, главный поток может подвисать из-за ожидания дополнительного, если потоки как-то связаны - например второй ждет выполнения SendMessage, когда действия по обработке сообщения выполняются в главном потоке. Или что-то аналогичное. В принципе может быть вариант, когда доп. поток тормозит всю систему, но это вряд ли ваш вариант. Если потоки не связаны, то ожидание дополнительным потоком ответа на запрос по интернету не должно влиять на работу основного потока. Так что по-моему стоит искать взаимосвязи потоков (в приведенном коде это вызовы SendMessage). Вы кстати не привели код из основного потока, который обрабатывает SendMessage, не показали, как создаете поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2018, 15:06 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Посмотрите, возможно Вам подойдет http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1355 Выделяете часть кода в отдельный поток, основной подождет выполнения задачи в этом потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2018, 15:21 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Потоки создаю и убираю правильно. Тормозит именно из-за IdHttp и других причин нет. Пишу же, прежде чем задать вопрос, протестировал всё - абсолютно каждую процедуру - место нашел правильно. Подобных тем на просторах нашел несколько, именно из потоков IdHTTP у людей глючит, именно что основная форма тормозит, но их решения мне не помогли. А помогло уменьшение параметра ReadTimeout. Сменил с 7000 на 2000 - зависания стали не более полусекунды, в принципе, для задачи приемлемо. Не решение, но пойдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2018, 15:35 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
зато теперь чаще будут возникать ошибки таймаута? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2018, 16:07 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Devillio... Тормозит именно из-за IdHttp и других причин нет. Пишу же, прежде чем задать вопрос, протестировал всё - абсолютно каждую процедуру - место нашел правильно. Подобных тем на просторах нашел несколько, именно из потоков IdHTTP у людей глючит, именно что основная форма тормозит, но их решения мне не помогли. ... Да, "кто-то в интернете написал". Ну да, есть такие вопросы. Вот, например: https://forum.antichat.ru/threads/delphi-potok-tormozit-formu.332817/ где начинается: в то время когда поток посылает POST запросы, форма виснет, как это решить? в каждом потоке IDhttp свой... а заканчивается: Все разобрался, тупанул я жестко, поток запускал не как поток а процедуру в нем(и это делалось через форму ) :D)) Вот так и у тебя скорее всего где-то ошибка, которую ты пока не увидел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2018, 16:19 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
s62, нам в очередной раз рассказывают сказки про тяжелое детство, вместо того, что бы разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 00:27 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Devillio, Не может из-за работы с TidHttp зависать главный поток. Совет - увеличь таймаут, в момент подвисания запаузи программу, пройдись по потокам и посмотри какой на чем остановился, особенно интересно на чем висит главный поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 07:19 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
ну или хотя бы кусок кода на ревью, как это главный поток зависает... есть вариант для зависания ГП, если мы создаем 1000 потоков, так вот пока они создаются и стартуют, он действительно висит... остальное все точно надуманное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 07:47 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
ZeliusDevillio, Не может из-за работы с TidHttp зависать главный поток. Совет - увеличь таймаут, в момент подвисания запаузи программу, пройдись по потокам и посмотри какой на чем остановился, особенно интересно на чем висит главный поток. это слишком сложно. Отлаживать надо, смотреть что там творится. Гораздо проще в мемо названия функций выводить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 10:45 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Vizit0r, кстати, мне реально сложно. Нажимаю паузу и вижу asm код, дальше F8 - так по asm и перемещается. Не знаю как определить какой строчке кода этот asm принадлежит. И не знаю как определять в каком месте сейчас главный поток и все остальные. А ошибку нашел. Посыпаю голову пеплом, в одном из таймеров было WaitFor, и мой метод проверки, конечно же, неправильный. ГП заходил в таймер, ждал остановки, и конечно же, эта задержка была в моменты read timeout. Нормально и даже отлично работает idHTTP из потока :) Благодарю за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 11:10 |
|
||
|
Форма зависает из-за idhttp
|
|||
|---|---|---|---|
|
#18+
Devillio, там ничего сложного, я тоже ассемблер не понимаю. жмешь паузу, открываешь View\Debug windows\Threads, дабл клик по первому потоку в списке, потом открываешь call stack - View\Debug windows\Call Stack, и дабл кликаешь по процедурам... конечно, отладочная информация должна быть включена и дебаг юнитс тоже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 11:19 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=119&tid=2041326]: |
0ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
71ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 238ms |
| total: | 424ms |

| 0 / 0 |
