Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Зависание фрейма, создаваемого вручную.


Автор: Ryoga 22.1.2010, 18:18
Итак, есть программа, часть которой представляет собой что-то вроде чата.
Чат этот многооконный, типо как в mirc'е, например.
Есть основной фрейм чата TChat, который содержит  TabControl, чтобы между окнами переключаться и список указателей на фреймы окон.
Фрейм окна TChatWindow, содержит всякие там текстовые поля, куда сообщения вводятся/выводятся, списки пользователей и т.д.
Так вот, в чём проблема...
Когда я создаю фрейм окна, посредством нажатия кпопки на основном фрейме чата, всё проходит нормально. Но когда фрейм окна создаётся в процедуре, вызываемой из потока, принимающего сообщения, новосозданный фрейм виснет.
Код создания используется и там и там один и тот же. Примерно такой...
Код

procedure TChat.AddFrame();
begin
      ...
      New(p);
      p^ := TСhatWindow.Create(self);
      p^.Initialize();
      p^.Align := alClient;
      p^.Users.Add(@pUser);
      TabControl.Tabs.Add(pUser^.name);
      TabControl.TabIndex := TabControl.Tabs.Count-1;
      FramesList.Add(p);
      p^.Parent := self;
      p^.Show();
      p^.BringToFront();
      ...
end;

При этом, если основное окно чата было скрыто, в момент прихода сообщения, то потом можно его открыть и всё работает нормально - фрейм добавился, всё переключается, ничего не виснет. Пробовал в процедуру 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 проще, чем критических секций наставлять. Переделал - фреймы создаются без ошибок. Правда там через некоторое время вылетает какое-то исключение, но это скорее всего не сильно связанные вещи - там ещё есть где багам развернуться.
Спасибо за помощь. Вообще странно, что сам сразу не дошёл до проверки на синхронизованность, благо уже как-то сталкивался с этой проблемой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)