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

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

Тормазит главная форма....


r.o.o.t ©   (2007-10-05 12:00:00) 

Господа подскажите я использую TSocketConnection но на слабых каналах свзяи тормазит все страшно в том числе и интерфей программы вынес TSocketConnection в Поток TTread
обращение к интефесу программы главной форме происходит
через Synchronize
тормаза остаются как быть как обстрагировать главную форму от TSocketConnection


Anatoly Podgoretsky   (2007-10-05 17:54:00) [1]

> r.o.o.t  (05.10.2007 12:43:02)  [2]

Архангельского начитался?


Сергей М.   (2007-10-05 13:37:00) [2]


> допустим убрал
> что дальше??


Дальше некуда - "тормоза" должны исчезнуть.


> примерную блок схему


Действуй по той же схеме, по которой действуешь в [9]


r.o.o.t   (2007-10-05 13:33:00) [3]

дай примерную блок схему как мне организовать вызовы процедур в потоке и чтоб они возвращали результать на форму без тормажений
на моем примере хотяб приблизительно.....
плиз


r.o.o.t   (2007-10-05 13:30:00) [4]

ну допустим убрал
что дальше??


Сергей М.   (2007-10-05 13:25:00) [5]

Убирай Exec_InitSrvConnection, Exec_GetSrvUserList,  Exec_SrvPing из основного потока.


r.o.o.t   (2007-10-05 13:18:00) [6]

так правлено или нет
пробую всерано замирает окно и ждет??


Palladin   (2007-10-05 13:16:00) [7]

уже гораздо разумней


r.o.o.t   (2007-10-05 13:03:00) [8]

т.е. типа вот так???
rocedure TCoreTread.Exec_GetSrvGroupList;
Var
  StrucGroupList:WideString;
  i:integer;
  s:string;

  MyTreeNode1      : TTreeNode;
  MyTreeNode2      : TTreeNode;

begin
 try
  Struc:=TStringList.Create;
  Struc.Text:=CAST5_Dicoding(
                             SrvConnection.AppServer.GetUserGroup(
                             CAST5_Encoding(Exec_GetSrvGroupList_RegionN,KeyHash),
                             CAST5_Encoding(Exec_GetSrvGroupList_RaionN,KeyHash)),
                             KeyHash);

  Synchronize(UpdateList);
 except
 end;
  Exec_GetSrvGroupList_RaionN:='';
  Exec_GetSrvGroupList_RegionN:='';
end;

Procedure UpdateList;
var
 i:integer;
  s:string;

  MyTreeNode1      : TTreeNode;
  MyTreeNode2      : TTreeNode;
begin
   frMain.UserTree.Items.BeginUpdate;
     frMain.NodeProcess:=true;
     node1.DeleteChildren;
     for i := 0 to Struc.Count - 1 do
     begin
      MyTreeNode1:=frMain.UserTree.Items.AddChild(Node1,Struc.Strings[i]);
      MyTreeNode1.ImageIndex:=1;
       MyTreeNode2:=frMain.UserTree.Items.AddChild(MyTreeNode1,'Loading...');
     end;

     frMain.UserTree.Items.EndUpdate;
  Struc.Free;
end;


Palladin   (2007-10-05 12:59:00) [9]

Ээ нет... я так убьюсь...

хинт: исполняй в синхронизе только то что касается вывода на форму остальное перенеси в контекст потока


r.o.o.t   (2007-10-05 12:55:00) [10]

хорошь глумится
дай пример как делать правлено??


Palladin   (2007-10-05 12:53:00) [11]

Стенку видишь? (c)


r.o.o.t   (2007-10-05 12:51:00) [12]

чего делать??


Сергей М.   (2007-10-05 12:47:00) [13]

Тормоза у тебя из-за того что обращение к объекту SrvConnection.AppServer осуществляется в основном потоке.


Palladin   (2007-10-05 12:45:00) [14]

молодца...


r.o.o.t   (2007-10-05 12:43:00) [15]

Procedure TCoreTread.Exec_InitSrvConnection;
begin
 try

  IPPort:=Exec_InitSrvConnection_IP_Port;
  IPAddres:=Exec_InitSrvConnection_IP_Adrr;
   SrvConnection:= TSocketConnection.Create(nil);
  SrvConnection.Address:=Exec_InitSrvConnection_IP_Adrr;
  SrvConnection.Port:=Exec_InitSrvConnection_IP_Port;

  SrvConnection.ServerGUID:='{AC69FABC-4752-4CF2-99E9-85CE86F99172}';
  SrvConnection.SupportCallbacks:=true;
  SrvConnection.LoginPrompt:=false;
  SrvConnection.Open;
  Exec_GetFile_FileList:=TStringList.Create;
  ContactUsersList:=TStringList.Create;
  InitSrvConnection:=true;
Except
end;
end;

rocedure TCoreTread.Exec_GetSrvGroupList;
Var
  StrucGroupList:WideString;
  i:integer;
  s:string;
  Struc:TStringList;
  MyTreeNode1      : TTreeNode;
  MyTreeNode2      : TTreeNode;

begin
 try
  Struc:=TStringList.Create;
  Struc.Text:=CAST5_Dicoding(
                             SrvConnection.AppServer.GetUserGroup(
                             CAST5_Encoding(Exec_GetSrvGroupList_RegionN,KeyHash),
                             CAST5_Encoding(Exec_GetSrvGroupList_RaionN,KeyHash)),
                             KeyHash);
     frMain.UserTree.Items.BeginUpdate;
     frMain.NodeProcess:=true;
     node1.DeleteChildren;
     for i := 0 to Struc.Count - 1 do
     begin
      MyTreeNode1:=frMain.UserTree.Items.AddChild(Node1,Struc.Strings[i]);
      MyTreeNode1.ImageIndex:=1;
       MyTreeNode2:=frMain.UserTree.Items.AddChild(MyTreeNode1,'Loading...');
     end;

     frMain.UserTree.Items.EndUpdate;
  Struc.Free;
 except
 end;
  Exec_GetSrvGroupList_RaionN:='';
  Exec_GetSrvGroupList_RegionN:='';
end;

procedure TCoreTread.Execute;
var
Signal_:string;
begin
 while True do
 begin
if SIGNAL<>nil then
  if SIGNAL.Count>0 then
  begin
    Signal_:=SIGNAL.Strings[0];
    SIGNAL.Delete(0);
  end;

  if SIGNAL_=SIGNAL_GET_SRV_GROUP_LIST then
     Synchronize(Exec_GetSrvGroupList);

  if SIGNAL_=SIGNAL_SRV_USER_LIST then
     Synchronize(Exec_GetSrvUserList);

  if SIGNAL_=SIGNAL_SRV_PING then
     Synchronize(Exec_SrvPing);
............
end;


Сергей М.   (2007-10-05 12:10:00) [16]

Показывай код ..


Наверх

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