Возможны конфликты при использовании параллельных потоков, когда потоки модифицируют одни и те же данные без защиты от одновременного доступа.
На одном или другом компьютере отличается только вероятность появления ошибок. Например, многопоточные ошибки значительно реже проявляются на одноядерных процессорах. Также на вероятность их появления влияет производительность/загруженность системы (когда загружена другой работой, то твоей программе отводится меньше времени исполнения, соответственно, меньше вероятность конфликтов).
Там осталось ещё одно узкое место: после замены таймера в главной форме добавление фразы "Пробуем отправить запрос..." в Memo получается тоже из параллельного потока - все такие действия тоже надо пускать через Synchronize. Убери Synchronize от контейнера и поставь сразу перед Memo.doAdd - будет гуд.
Редактировалось 1 раз(а), последний 2021-02-12 17:59:54
Этот топик читают: Гость
Ответов: 4630
Рейтинг: 749
|
|||
карма: 26 |
| ||
Голосовали: | MBO |
Ответов: 39
Рейтинг: 0
|
|||
Понятно, спасибо
|
|||
карма: 0 |
|
Ответов: 39
Рейтинг: 0
|
|||
Такие вопросы возникли
Можно ли в одном потоке запускать несколько отправок запросов? Можно ли стопить поток чтобы обработать ответ? Может как то можно переписать хттп клиент чтобы не париться с потоками?)) что бы он был как старый хттп_гет На компиляторе делфи такой ошибки не возникало, она появилась на fpc32 может там проблема? --- Добавлено в 2021-02-12 23:48:48 А, может быть, поможет действительно вызывать поток внутри контейнера (faststop=true) с отправкой запроса. А на выходе поставить synchronize? Или может быть есть возможность сначала, при отправке поток запустить, а перед выходом из контейнера остановить? А то у меня работа программы завязан на остановке главного таймера (как в ручную так и программно при возникновении ошибок для генерации нового запроса) Редактировалось 2 раз(а), последний 2021-02-12 23:49:37 |
|||
карма: 0 |
|
Ответов: 4630
Рейтинг: 749
|
|||
MBO писал(а): Можно ли в одном потоке запускать несколько отправок запросов?MBO писал(а): Можно ли стопить поток чтобы обработать ответ?MBO писал(а): Может как то можно переписать хттп клиент чтобы не париться с потоками?MBO писал(а): На компиляторе делфи такой ошибки не возникало, она появилась на fpc32 может там проблема?MBO писал(а): А, может быть, поможет действительно вызывать поток внутри контейнера (faststop=true) с отправкой запроса. А на выходе поставить synchronize?MBO писал(а): Или может быть есть возможность сначала, при отправке поток запустить, а перед выходом из контейнера остановить?MBO писал(а): А то у меня работа программы завязан на остановке главного таймера (как в ручную так и программно при возникновении ошибок для генерации нового запроса)Редактировалось 3 раз(а), последний 2021-02-14 14:44:03 |
|||
карма: 26 |
|
Ответов: 39
Рейтинг: 0
|
|||
Еще заметил такой баг, что WinExec перестает открывать URL в браузере (хотя файлы открываются нормально)
|
|||
карма: 0 |
|
Ответов: 39
Рейтинг: 0
|
|||
И я заметил еще такую строку в теме с новым компилятором:
спойлер Внимание: на данный момент существует утечка памяти при использовании параллельных потоков. Для исправления после установки компилятора надо открыть файл "HiAsm\compiler\FPC2\fpc.cfg", в строке 20 вместо "-O3" поставить "-O1", сохранить. После чего выполнить файлы
"HiAsm\compiler\FPC2\src\_make_ALL_A.bat" "HiAsm\compiler\FPC2\src\_make_ALL_U.bat" Если это сделать, это должно помочь? (если схему не менять, и оставить как было изначально) |
|||
карма: 0 |
|
Ответов: 4630
Рейтинг: 749
|
|||
MBO писал(а): это должно помочь?Редактировалось 2 раз(а), последний 2021-02-16 13:04:32 |
|||
карма: 26 |
|
Ответов: 39
Рейтинг: 0
|
|||
Netspirit писал(а): MBO писал(а):
это должно помочь? Помочь с чем? С проблемой утечки памяти на компиляторе FPC 3.2.0? Да, ничего другого менять не надо. Все проблемы твоей программы это не решает - это конкретный нюанс конкретно этой сборки компилятора. Редактировалось 2 раз(а), последний 2021-02-16 13:04:32 В общем, спасибо тебе за помощь В итоге, я свел все к такой схеме отправки запроса:
Грубо говоря - я сначала запускаю поток и ставлю блокировку от повторений. А когда я подготавливаю новые данные для отправки на сервер я снимаю блок, посылаю данные ХТТПКлиенту и ставлю блок заново Как я понял, то запускать и стопить поток так часто это не очень хорошо, лучше пусть генерирует события в холостую. Программа уже 5+ часов бесперебойно пашет Последний вопрос, может лучше стопить поток, если минут 5-10 на хттпКлиент не посылались запросы (грубо говоря, пользователь сам тыкнул кнопку паузы)? Таких потоков у программы может быть 15-20 одновременно (это прям максимум) а в среднем 4-5 |
|||
карма: 0 |
|
Ответов: 4630
Рейтинг: 749
|
|||
1) Да, перезапускать часто поток нерационально, лучше ставить на паузу
2) Насколько понимаю, ты останавливаешь запросы, не останавливая поток - с помощью If_else. Благодаря Delay=500 это приемлемо. Ещё можно ставить на реальную паузу с помощью WaitObject+Events. MBO писал(а): Последний вопрос, может лучше стопить поток, если минут 5-10 на хттпКлиент не посылались запросы (грубо говоря, пользователь сам тыкнул кнопку паузы)? Редактировалось 1 раз(а), последний 2021-02-16 14:18:20 |
|||
карма: 26 |
|
Ответов: 39
Рейтинг: 0
|
|||
То есть, тормозить (doStopFlag) поток после нескольких минут неактивности (планирую поставить 15 минут) - это норм?
|
|||
карма: 0 |
|
Ответов: 4630
Рейтинг: 749
|
|||
Да. Когда отработает ветка onExec, компонент Thread проверит флаг остановки и прекратит генерировать onExec, корректно завершившись.
После следующего doExec поток будет запущен вновь и продолжит выдавать события onExec. Редактировалось 1 раз(а), последний 2021-02-16 14:53:33 |
|||
карма: 26 |
|
26