|
|
|
поток зависает
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Суть проблемы в том, что через некоторое время программа зависает. В программе создается поток, который лезет в бд и берет оттуда список фтп, лезет в каждый фтп и считывает кол-во файлов. Далее посчитанное кол-во выводит в таблице. Работает где-то 4 часа нормально, а потом ни с того ни с сего винда показывает, что программа зависла, при этом никаких ошибок нет, пытался вынести в лог сообщение об ошибках, в лог тоже после зависания перестает писать. Вес программы не увеличивается и стабильно находится в районе 7 мегабайт. Грешу на переполнение очереди сообщений виндовс, но не знаю, как это поправить. Ставил Application.ProcessMessages в дополнительном потоке - не помогает. Также грешу на TIdFtp Indy. И на свои кривые руки ) Код: 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. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 13:19 |
|
||
|
поток зависает
|
|||
|---|---|---|---|
|
#18+
evgen29, Ваш поток не работает. Этой командой вы всю работу потока свели на нет. Код: pascal 1. Он выполняется в основном потоке. Синхронизация нужна только для доступа к UI. Чтобы поток заработал, необходимо полностью изменить подход, а не просто "скопировать код". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 13:26 |
|
||
|
поток зависает
|
|||
|---|---|---|---|
|
#18+
goldmi45, а можно подробности? так-то и я могу ответить ))) странно, но даже в примерах delphi подход через synchronize() как лечить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 13:30 |
|
||
|
поток зависает
|
|||
|---|---|---|---|
|
#18+
goldmi45 безусловно прав. Обязательно почитайте про synchronize и потоки. Но причина зависания вряд ли в этом. Попробуйте IsMultiThread := true; установить перед созданием потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 13:37 |
|
||
|
поток зависает
|
|||
|---|---|---|---|
|
#18+
evgen29goldmi45, а можно подробности? так-то и я могу ответить ))) Для начала необходимо отделить расчётную часть от отображения. Поток не должен обращаться к интерфейсу для получения каких-либо данных. Самое простое - создать в потоке соединение с БД и с ним работать. Отображение можете засунуть в synchronize. Или использовать сообщения форме. evgen29странно, но даже в примерах delphi подход через synchronize() Читайте про потоки и синхронизацию. И уж в примерах дельфи нет такого кода, что весь поток выполняется в методе synchronize (как у вас). evgen29как лечить? Читать про потоки и синхронизацию. С наскока за пару минут это не осваивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 13:41 |
|
||
|
поток зависает
|
|||
|---|---|---|---|
|
#18+
evgen29, ну и ещё - мало записей в лог. Application.ProcessMessages в дополнительном потоке - не нужно. Протоколируйте доступ на фтп. Наверняка это не атомарная функция. Протоколируйте время записи - будет видно время выполнения операций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 13:47 |
|
||
|
поток зависает
|
|||
|---|---|---|---|
|
#18+
goldmi45, да суть в том,что класс лога пишет время записи и по нему можно определить, когда запись была сделана, но проблема в зависании программы, когда программа не отвечает и в лог ничего не пишется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 13:50 |
|
||
|
поток зависает
|
|||
|---|---|---|---|
|
#18+
evgen29, попробуй https://github.com/wadman/wthread скелет твоего приложения будет выглядеть примерно так: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 14:27 |
|
||
|
поток зависает
|
|||
|---|---|---|---|
|
#18+
Там же есть модуль wlog и потокобезопасная процедура PostToLog для логирования в файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 14:27 |
|
||
|
поток зависает
|
|||
|---|---|---|---|
|
#18+
evgen29, с учетом замечаний, у тебя логика должна выглядеть примерно так Код: 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. Причем, новый коннект, как и сказали, нужно делать в потоке, внутри CallMonitorCycle и закрывать его в той же процедуре, поскольку вызов CallMonitorCycle у тебя происходит циклически, сюда по коду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2019, 14:52 |
|
||
|
поток зависает
|
|||
|---|---|---|---|
|
#18+
evgen29странно, но даже в примерах delphi подход через synchronize()Где? Примеры в студию.SinemuriusПопробуйте IsMultiThread := true; установить перед созданием потока.Он устанавливается при вызове функции BeginThread, которая вызывается из конструктора TThread ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2019, 14:50 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39779272&tid=2039752]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
212ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 469ms |

| 0 / 0 |
