![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
СУБД в доп.потоке [D7, MySQL]
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]не подскажете как можно наладить ?