Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: WinAPI и системное программирование > Зависание фрейма, создаваемого вручную. |
Автор: Ryoga 22.1.2010, 18:18 | ||
Итак, есть программа, часть которой представляет собой что-то вроде чата. Чат этот многооконный, типо как в mirc'е, например. Есть основной фрейм чата TChat, который содержит TabControl, чтобы между окнами переключаться и список указателей на фреймы окон. Фрейм окна TChatWindow, содержит всякие там текстовые поля, куда сообщения вводятся/выводятся, списки пользователей и т.д. Так вот, в чём проблема... Когда я создаю фрейм окна, посредством нажатия кпопки на основном фрейме чата, всё проходит нормально. Но когда фрейм окна создаётся в процедуре, вызываемой из потока, принимающего сообщения, новосозданный фрейм виснет. Код создания используется и там и там один и тот же. Примерно такой...
При этом, если основное окно чата было скрыто, в момент прихода сообщения, то потом можно его открыть и всё работает нормально - фрейм добавился, всё переключается, ничего не виснет. Пробовал в процедуру Hide() и Show() добавлять для основного окна - не помогло. Почему так происходит? |
Автор: artsb 22.1.2010, 20:11 |
А у вас вся работа из вспомогательного потока с основным организована через Synchronize? |
Автор: Ryoga 25.1.2010, 17:08 |
Походу, нет. Попробую понаставить критических секций на запись и функции отрисовки. |
Автор: artsb 25.1.2010, 17:33 |
Попробуйте. Но вообще необходимость в Synchronize возникает только при работе с VCL. |
Автор: Ryoga 1.2.2010, 18:31 |
В общем, покопавшись в коде, решил, что сделать через Synchronize проще, чем критических секций наставлять. Переделал - фреймы создаются без ошибок. Правда там через некоторое время вылетает какое-то исключение, но это скорее всего не сильно связанные вещи - там ещё есть где багам развернуться. Спасибо за помощь. Вообще странно, что сам сразу не дошёл до проверки на синхронизованность, благо уже как-то сталкивался с этой проблемой. |