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

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

СУБД в доп.потоке [D7, MySQL]


Страницы:   1 2

Danz1 ©   (2010-07-28 15:24:00) 

у меня очень виснет программа изза этого кусочка
помогите сделать запросы в дополнительном потоке
правильно... чтобы программа не висла...
вот что накидал я


type
  TMyThread1 = class(TThread)
  private
    { Private declarations }
  protected
    procedure DoWork;
  end;

var
T1   : TMyThread1;
 lefttime: integer;

implementation
uses unit1,unit4,unit5, Unit6;
{$R *.dfm}

procedure TMyThread1.DoWork;
var ok:boolean;
begin
     try
MySQLResult:=MySQLClient.Query('SELECT pkey.lefttime FROM pkey WHERE pkey.`key` =  "' + pkey + '"',True,OK);
lefttime:=strtoint(MySQLResult.FieldValueByName('lefttime'));
except
 on E:EAccessViolation do
  form1.close;
end;
end;

procedure TDataModule3.Timer10Timer(Sender: TObject);
var
 ok:boolean;
begin
  if  (strtoint(mygroupid)<>6) and (strtoint(mygroupid)<>9) then
   begin

    T1 := TMyThread1.Create(False);

    T1.Execute;

     form1.sLabelFX5.Caption:=inttostr(lefttime);

       if lefttime < 300 then

       begin
          form1.sLabelFX5.kind.Color:=clred;
       end
        else
        begin
        form1.sLabelFX5.kind.Color:=$0033CC33;
         end;

       if lefttime <> 0 then

           begin
             T1.Terminate;
             lefttime:=lefttime-1;
             MySQLClient.Query('UPDATE pkey SET lefttime = "' + inttostr(lefttime) + '" WHERE pkey.`key` = "' + pkey + '"', True, OK);
           end
            else
          begin
             T1.Terminate;
             DataModule3.Timer10.Enabled:=false;
             form1.Close;
          end;

   end
    else
   begin
   T1.Terminate;
   DataModule3.Timer10.Enabled:=false;
   form1.sLabelFX5.kind.Color:=$d6c043;
   form1.sLabelFX5.Caption:='Unlimited';
   end;

end;


DanzI   (2010-07-28 19:36:00) [21]

Сама программа работает на локал очень здорово просто  грузит у других очень  но только у тех кто вне города... и то... бываю исключения у моего знакомого  совсем из другого города работает а у его друга который сидит на том же провайдере что и он нет... проверял все что только можно но точно дело не в ОС... это 100% тк одинаковые ОС у некоторых пашет у некоторых нет...
Кстати виснет как... зависает только меню... и все  просто становится не кликабельным, убираю этот кусок кода и все у всех нормально....

но кодом я пользуюсь не совсем этим мне просто посоветовали для снятия нагрузки использовать мульти потоки .

вот оригинальный разницы почти нету...

procedure TDataModule3.Timer10Timer(Sender: TObject);
var
 ok:boolean;
 lefttime:integer;
begin
 if  (strtoint(mygroupid)<>6) and (strtoint(mygroupid)<>9) then
   begin

     MySQLResult:=MySQLClient.Query('SELECT pkey.lefttime FROM pkey WHERE pkey.`key` =  "' + pkey + '"',True,OK);

     lefttime:=strtoint(MySQLResult.FieldValueByName('lefttime'));
     form1.sLabelFX5.Caption:=inttostr(lefttime);

       if lefttime < 300 then

       begin
          form1.sLabelFX5.kind.Color:=clred;
       end
        else
        begin
        form1.sLabelFX5.kind.Color:=$0033CC33;
         end;

       if lefttime <> 0 then

           begin
             lefttime:=lefttime-1;
             MySQLClient.Query('UPDATE pkey SET lefttime = "' + inttostr(lefttime) + '" WHERE pkey.`key` = "' + pkey + '"', True, OK);
           end
            else
          begin
             DataModule3.Timer10.Enabled:=false;
             form1.Close;
          end;
   end
    else
   begin
   DataModule3.Timer10.Enabled:=false;
   form1.sLabelFX5.kind.Color:=$d6c043;
   form1.sLabelFX5.Caption:='Unlimited';
   end;
end;


Anatoly Podgoretsky   (2010-07-28 19:17:00) [22]

> DanzI  (28.07.2010 17:08:13)  [13]

Если приложение виснет, то ни о какой нагрузки говорить не приходится,
сначала заставь работать, вот тогда можно говорить и о нагружке


DanzI   (2010-07-28 17:59:00) [23]

Уважаемые знатоки помогите решить проблему


DanzI   (2010-07-28 17:42:00) [24]

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


DanzI   (2010-07-28 17:08:00) [25]

тогда можете посоветовать как можно сделать так чтобы уменьшить нагрузку ?... тк приложение виснет а что самое обидное не все а только mainmenu посоветуйте как можно исправить это положение ?


Anatoly Podgoretsky   (2010-07-28 16:59:00) [26]

> DanzI  (28.07.2010 16:41:06)  [6]

Что его, не стыкуется с правилами русского языка.


Anatoly Podgoretsky   (2010-07-28 16:58:00) [27]

> DanzI  (28.07.2010 16:40:05)  [5]

Это по Архангельски, в этом случае поток лишний.


И. Павел   (2010-07-28 16:53:00) [28]

> что значит асинхронно ?

Неужели гугл за 1 мин. просмотрели, и он вам ничего не подсказал про асинхронный режим?


DanzI   (2010-07-28 16:48:00) [29]

что значит асинхронно ?


И. Павел   (2010-07-28 16:47:00) [30]

Можно попробовать так:
 while not Terminated do
 begin
   Synchronize(DoWork);
   sleep(1000);
 end;

А можно посылать запросы асинхронно.


DanzI   (2010-07-28 16:42:00) [31]

у меня таймер должен брать каждую сек время сколько осталось...


DanzI   (2010-07-28 16:41:00) [32]

можете объяснить как его сделать в доп потоке пожалусто


DanzI   (2010-07-28 16:40:00) [33]

если вместе с ним то было бы так

type
 TMyThread1 = class(TThread)
 private
   { Private declarations }
 protected
   procedure DoWork;
   procedure Execute; override;
 end;

var
T1   : TMyThread1;
lefttime: integer;

implementation
uses unit1,unit4,unit5, Unit6;
{$R *.dfm}

procedure TMyThread1.DoWork;
var ok:boolean;
begin
    try
MySQLResult:=MySQLClient.Query('SELECT pkey.lefttime FROM pkey WHERE pkey.`key` =  "' + pkey + '"',True,OK);
lefttime:=strtoint(MySQLResult.FieldValueByName('lefttime'));
except
on E:EAccessViolation do
 form1.close;
end;
end;

procedure TMyThread1.Execute;
begin
  while not Terminated do
    Synchronize(DoWork);
end;

procedure TDataModule3.Timer10Timer(Sender: TObject);
var
ok:boolean;
begin
 if  (strtoint(mygroupid)<>6) and (strtoint(mygroupid)<>9) then
  begin

   T1 := TMyThread1.Create(False);

   T1.Execute;

    form1.sLabelFX5.Caption:=inttostr(lefttime);

      if lefttime < 300 then

      begin
         form1.sLabelFX5.kind.Color:=clred;
      end
       else
       begin
       form1.sLabelFX5.kind.Color:=$0033CC33;
        end;

      if lefttime <> 0 then

          begin
            T1.Terminate;
            lefttime:=lefttime-1;
            MySQLClient.Query('UPDATE pkey SET lefttime = "' + inttostr(lefttime) + '" WHERE pkey.`key` = "' + pkey + '"', True, OK);
          end
           else
         begin
            T1.Terminate;
            DataModule3.Timer10.Enabled:=false;
            form1.Close;
         end;

  end
   else
  begin
  T1.Terminate;
  DataModule3.Timer10.Enabled:=false;
  form1.sLabelFX5.kind.Color:=$d6c043;
  form1.sLabelFX5.Caption:='Unlimited';
  end;

end;


И. Павел   (2010-07-28 16:39:00) [34]

Таймер выполняется в главном потоке, и T1.Execute, поэтому, поже выполнится в главном потоке.
PS: кстати, совсем недавно была почти такая же тема.


DanzI   (2010-07-28 16:34:00) [35]

я пытался с ним но оно зацикливалось...если можете обьяните


Anatoly Podgoretsky   (2010-07-28 15:56:00) [36]

> Danz1  (28.07.2010 15:24:00)  [0]

А где Execute?


DanzI   (2010-07-28 15:26:00) [37]

я ошибся вместо T1.Execute; поставьте  T1.DoWork;


Страницы:   1 2

Наверх

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