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;


Anatoly Podgoretsky   (2010-07-30 07:35:00) [1]

> DanzI  (30.07.2010 00:30:30)  [30]

Сначала букварь, потом помощь, иначе потеряные деньги.


DanzI   (2010-07-30 02:47:00) [2]

Обычно думают не только после обучения но и в процессе.


Германн   (2010-07-30 02:38:00) [3]


>
> я не думаю что вы настолько мудрый человек чей совет был
> бы полезен

Прежде чем "думать" надо "изучить". А вот этого у тебя и нет.


DanzI   (2010-07-30 02:30:00) [4]

Ладно вообщем хороших программистов много... желающих помочь не так уж и много. Спасибо Anatoly Podgoretsky , И. Павел. всем остальным которые участвовали отдельное спасибо за *Теплое гостеприимство*,*Мудрые советы*,и не как не грубость.

и к тому же

> Дальше можно не продолжать, ибо мне пофиг.

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


Германн   (2010-07-30 01:21:00) [5]


> Если вам не трудно объясните, не нужно говорить что человек
> не понимает итд итп вместо этого лучше посоветовать.

В переводе на русский это выглядит так - "Дайте готовый код".


turbouser   (2010-07-30 01:05:00) [6]


> Если вам не трудно объясните

Не трудно.

> вместо этого лучше посоветовать.

Что посоветовать, когда автор сам не понимает что делает и не объясняет чтоделает? Мм?


Плохиш   (2010-07-30 00:58:00) [7]


> и информации внятной не так уж и много...

Дальше можно не продолжать, ибо мне пофиг.


DanzI   (2010-07-30 00:30:00) [8]

пытаюсь параллельно читать и говорят что в этом месте  T1.Execute; ставить нужно T1.Suspended := false;

procedure TForm1.FormCreate(Sender: TObject);
..........................
..........................
if (strtoint(mygroupid)<>6) and (strtoint(mygroupid)<>9) then
begin
T1 := TMyThread1.Create(False);
T1.Suspended := false;
end;
end;

И везде заменил T1.Terminate; на T1.Free; т.к выбивает ошибку


> Была процетирована строка сделанная недокодером, а что она
> делает совершенно не важно. Прочитай про переменную self.
>
> А искать проблемы в коде, сделанном без понимания основ,
>  является бессмысленно выкинутым временем.


Программа опять заработала .... но только у меня и у моих друзей с города...

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


Anatoly Podgoretsky   (2010-07-29 23:01:00) [9]


> всё всё-равно делается в основном потоке.

Не все, спит то в дополнительном :-)


Игорь Шевченко   (2010-07-29 20:59:00) [10]


> Кто-нибуть может объяснить какой здесь великий смысл в потоке


тебе не пофиг ?


Плохиш   (2010-07-29 19:29:00) [11]


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

Кто-нибуть может объяснить какой здесь великий смысл в потоке, всё всё-равно делается в основном потоке.


Плохиш   (2010-07-29 19:27:00) [12]


> DanzI   (29.07.10 03:16) [20]
>
> а зачем цитировать выключение таймера ?... в программе так
> задумано... вместо помощи... проще сказать простейшее и
> выйти...

Была процетирована строка сделанная недокодером, а что она делает совершенно не важно. Прочитай про переменную self.
А искать проблемы в коде, сделанном без понимания основ, является бессмысленно выкинутым временем.


DanzI   (2010-07-29 15:30:00) [13]

Я решил вернутся у потокам и сделал вот так но виснет


lefttime:integer = значения берутся... то есть они верные и они существуют

Юнит 1

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

var
 T1 : TMyThread1;

implementation

uses Unit3, Unit2,unit4, Unit5, unit8, Unit10;
{$R *.dfm}

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

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' );
   lefttime:=lefttime-1;
   MySQLClient.Query('UPDATE pkey SET lefttime = "' + inttostr(lefttime) + '" WHERE pkey.`key` = "' + pkey + '"', True, OK);
except
  on E:EAccessViolation do
    begin
     T1.Terminate;
     form1.close;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
..........................
..........................
if (strtoint(mygroupid)<>6) and (strtoint(mygroupid)<>9) then
 begin
 T1 := TMyThread1.Create(False);
 T1.Execute;
 end;
end;

Юнит 2

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

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

       if lefttime < 300 then
          form1.sLabelFX5.kind.Color:=clred
        else
          form1.sLabelFX5.kind.Color:=$0033CC33;

       if lefttime <= 0 then
          begin
             DataModule3.Timer10.Enabled:=false;
             T1.Terminate;
             form1.Close;
          end;
   end
    else
   begin
   DataModule3.Timer10.Enabled:=false;
   T1.Terminate;
   form1.sLabelFX5.kind.Color:=$d6c043;
   form1.sLabelFX5.Caption:='Unlimited';
   end;
end;


DanzI   (2010-07-29 15:11:00) [14]

это отменяется ... ( делал по правилам эффекта опять же 0...


DanzI   (2010-07-29 13:09:00) [15]

мне посоветовали Application.ProcessMessages(); говорят использовать его только в циклах... попробовал вроде получилось ) только я не совсем понял как его применять просто в цикле прописывать ? и все ?


DanzI   (2010-07-29 12:41:00) [16]

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


Anatoly Podgoretsky   (2010-07-29 08:37:00) [17]

> DanzI  (28.07.2010 19:36:17)  [17]

Вообще то потоки увеличивают общею нагрузку.


DanzI   (2010-07-29 03:16:00) [18]

а зачем цитировать выключение таймера ?... в программе так задумано... вместо помощи... проще сказать простейшее и выйти...


Плохиш   (2010-07-29 01:34:00) [19]


> procedure TDataModule3.Timer10Timer(Sender: TObject);
>


>              DataModule3.Timer10.Enabled:=false;
>

Тут не надо ничего налаживать, тут руки недокодеру отрывать надо.


DanzI   (2010-07-29 00:34:00) [20]

не подскажете как можно наладить ?


Страницы:   1 2

Наверх

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