В моем приложении у меня есть окно 'logging', в котором отображаются все журналы, предупреждения, ошибки приложения.
В прошлом году мое приложение было все еще однопоточным, так что это работало [довольно] хорошо.
Теперь я представляю многопоточность. Я быстро заметил, что не стоит обновлять окно регистрации из разных потоков. Читая некоторые статьи о сохранении пользовательского интерфейса в главном потоке, я создал буфер обмена, в который другие потоки добавляют свои сообщения регистрации, и из которого основной поток берет сообщения и показывает их в окне регистрации (это делается в цикл сообщений).
Теперь, в части моего приложения, использование памяти резко увеличивается, потому что отдельные потоки генерируют много сообщений регистрации, и основной поток не может достаточно быстро очистить буфер связи. Через некоторое время память снова уменьшается (если другие потоки закончили свою работу и основной поток постепенно очищает буфер связи).
Я решил эту проблему, установив максимальный размер буфера связи, но затем столкнулся с проблемой в следующей ситуации:
- основной поток должен выполнить сложное действие
- основной поток выполняет некоторые части действия, и давайте отдельные потоки выполнят это
- пока отдельные потоки выполняют свою логику, основной поток обрабатывает результаты других потоков и продолжает свою работу, если другие потоки завершены
Проблема в том, что в этой ситуации, если другие потоки выполняют ведение журнала, цикл сообщений UI отсутствует, и поэтому буфер связи заполняется, но не очищается.
Я вижу два решения в решении этой проблемы:
- требует, чтобы основной поток выполнял регулярный опрос буфера связи
- только выполнение логики пользовательского интерфейса в главном потоке (никакой другой логики)
Я думаю, что второе решение кажется лучшим, но это может быть не так просто внедрить в большое приложение (в моем случае оно выполняет математическое моделирование).
Есть ли другие решения или советы?
Или одно из двух предложило лучшее, простое, наиболее прагматичное решение?
Спасибо,
Patrick