Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

хммм. Visible := true; <-- как на API ?


DevilDevil ©   (2007-08-14 16:42:00) 

Проблема вообще вот в чём...

Используется несколько потоков, один из которых вызывает Синхронайз()...

В определённый момент приложение зависает.
Опытным путём было установлено, что программа зависает в момент Компонент.Visible := true;Ранее упомянутый поток тоже останавливается в момент синхронизации.

Предположение следующее...
Компонент каким то образом посылает себе какое то сообщение.
"Одновременно" в OnIdle обрабатывается неглавный поток, ...

В общем, внесите во весь этот бред смысл; почему SetVisible(true) может приводить к зависанию?

P.S. два этих потока (главный и неглавный) никак не связаны. особенно через этот компонент.
P.P.S. вот я и пробовал отослать компоненту сообщение для визуализации, избегая стандартного Visible подхода... но так и не понял, как это делается на WinApi. Ни ShowWindow, ни WM_SHOWWINDOW окно (компонент) не визуализировали.


Eraser   (2007-08-14 18:13:00) [1]


> DevilDevil ©   (14.08.07 18:10) [6]

дома гляну возможную причину, сейчас под рукой Делфи нет.


DevilDevil   (2007-08-14 18:10:00) [2]

> думаю ошибка в 17 строке.

Врядли... комментарии вроде не компилируются...

А если серьёзно, в плане Visible, он остался вся тем же TCustomPanel


Eraser   (2007-08-14 18:07:00) [3]


> P.S. вся работа здесь производится с моим компонентом;

а, ну так с этого и надо было начинать ) тут уж нужно смотреть реализацию свойства компонента. думаю ошибка в 17 строке.


DevilDevil   (2007-08-14 17:52:00) [4]

for i := 0 to PanelsCount-1 do
begin
   P  = TActivePanel(FList[i]);

  if P = Panel) then
  begin
     P.SetTitleColors(P.ColorActive1, P.ColorActive2);
     if RestoreOnMinimize or P.Minimized then
        begin
           P.Maximized := false;
           P.Minimized  := false;
        end;

     Application.ProcessMessages;
     P.Visible := true;

     P.BringToFront;
  end
  else
     P.SetTitleColors(P.ColorInactive1, P.ColorInactive2);
end;


P.S. вся работа здесь производится с моим компонентом; но виснет именно на P.Visible := true;


MetalFan   (2007-08-14 17:33:00) [5]

а иде тут паскаль???


DevilDevil   (2007-08-14 17:10:00) [6]

не помогает.

 int PanelsCount = FList->Count;

 for (int i = 0; i < PanelsCount;i++)
 {
   TActivePanel* P  = (TActivePanel*)FList->Items[i];
   if (P == Panel)
      {
       P->SetTitleColors(P->ColorActive1, P->ColorActive2);   //ACTIVE1, ACTIVE2);
       if (RestoreOnMinimize && P->Minimized) {P->Maximized = false; P->Minimized = false;}
       Application->ProcessMessages();
       if (!P->Visible) P->Visible = true;
        //if (!P->Visible) SendMessage(P->Handle, WM_SHOWWINDOW, 1, 0);
        //ShowWindow(P->Handle, SW_SHOWNORMAL);

       P->BringToFront();
      }
   else
      P->SetTitleColors(P->ColorInactive1, P->ColorInactive2);//INACTIVE1, INACTIVE2);
 }


Всё виснет по Visible = true;


Eraser   (2007-08-14 16:50:00) [7]


> DevilDevil ©   (14.08.07 16:42) 

для стандартных делфевских форм лучше дейтсвительно испольовать VCL средства, а не winAPI, иначе проблемы могут быть.

попробуй сразу после и непосредственно перед вызовом SetVisible вызывать Application.ProcessMessages, хотя лучше конечно код покажи.


Наверх

Титульная страница Поиск, карта сайта Написать письмо