![]() |
| ||
|
|
Новости |
Поиск |
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;
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;