![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка в выполнении параллельного потока [D2005, XP]
ГореПрограммер © (2006-11-07 12:51:00)Здравствуйте.
есть клас:
Tloadfon = class(TThread)
protected
procedure sinform;
procedure Execute; override;
end;
procedure tloadfon.sinform;
begin
fstart.prog1.StepIt;
end;
procedure tloadfon.Execute;
var i:integer;
begin
FreeOnTerminate := True;
for i := 0 to ar_excel.count - 1 do
begin
if Terminated then
Break;
loadip(ar_excel.zaps[i].mac,i);
getminup(ar_excel.zaps[i].id);
Synchronize(sinform);
end;
end;
В момент обращения к нему, т.е.
tloadfon.create(false);
выдается ошибка базы данных:
dbExpress Error: Unknown Error Code '256'
[0x0005]: Operation Not Supported
Database Server Error: Failed to query the server.(Error "2013"; Reason "Lost connection to MySQL server during query")
если выполнять функции loadip и getminup не в этом потоке, а просто в программе, то никаких ошибок не происходит. Подскажите пожалуйста где искать ошибку ?
Сергей М. (2006-11-07 13:24:00) [101]
> Мне необходимо чтобы
> > procedure tloadfon.Execute;
>
> выполнилась только один раз
Он (этот метод) всего одинраз и выполнится, вне зависимости от того что у него в "потрохах"
ГореПрограммер (2006-11-07 13:18:00) [102]
> > loadip(ar_excel.zaps[i].mac,i);
> > getminup(ar_excel.zaps[i].id);
>
> Убирай в Synchronize()
Спасибо, все заработало.
Вот только второй вопрос. Мне необходимо чтобы
> procedure tloadfon.Execute;
выполнилась только один раз. Каким образом её следует переписать, чтобы после прохождения цикла поток прекратил свою работу ?
пробовал так:
> procedure tloadfon.sinform;
> begin
> fstart.prog1.StepIt;
> end;
> procedure tloadfon.Execute;
> var i:integer;
> begin
> FreeOnTerminate := True;
> for i := 0 to ar_excel.count - 1 do
> begin
> if Terminated then
> Break;
> loadip(ar_excel.zaps[i].mac,i);
> getminup(ar_excel.zaps[i].id);
> Synchronize(sinform);
> end;
> terminate;
> end;
не помогло, все равно цикл выполняется еще раз
MetalFan (2006-11-07 13:16:00) [103]
> DVM © (07.11.06 13:05) [6]
>
> Убирай в Synchronize()
... и смысл вынесения в поток теряется)
DVM (2006-11-07 13:05:00) [104]
> массив записей (record)
Этот массив кем-то чем-то может быть изменен во время отработки потока?
Если да - будут глюки.
> loadip(ar_excel.zaps[i].mac,i);
> getminup(ar_excel.zaps[i].id);
Убирай в Synchronize()
ГореПрограммер (2006-11-07 13:03:00) [105]
> что есть fproc?
> ты из потока к VCL компонентам лезешь...
> создавай q2 в потоке)
fproc это модуль, в котором содержится q2.
Поток создается в другом модуле
ГореПрограммер (2006-11-07 13:02:00) [106]
> > ar_excel
массив записей (record)
> > loadip(ar_excel.zaps[i].mac,i);
> > getminup(ar_excel.zaps[i].id);
procedure loadip(mac:string;ind:integer);
var i,j:integer;
begin
strex:=strex+'loadip';
fproc.q2.Active:=false;
fproc.q2.SQL.Clear;
fproc.q2.SQL.Add('select ip from ip_addr where mac_term='''+mac+'''');
fproc.q2.Active:=true;
......
function getminup(id:string):string;
begin
fproc.q2.Active:=false;
fproc.q2.SQL.Clear;
fproc.q2.SQL.Add('select min(date_up) from Jurup where Term_id='+id);
fproc.q2.Active:=true;
.....
MetalFan (2006-11-07 13:01:00) [107]что есть fproc?
ты из потока к VCL компонентам лезешь...
создавай q2 в потоке)
DVM (2006-11-07 12:58:00) [108]
> ГореПрограммер (07.11.06 12:51)
> ar_excel
Это чаво такое и почему обращение к этой переменной может быть безопасным?
> loadip(ar_excel.zaps[i].mac,i);
> getminup(ar_excel.zaps[i].id);
Это чаво?
ГореПрограммер (2006-11-07 12:54:00) [109]Да, если это имеет значение,
procedure loadip(mac:string;ind:integer);
fproc.q2.Active:=false;
fproc.q2.SQL.Clear;
fproc.q2.SQL.Add('select ip from ip_addr where mac_term='''+mac+'''');
fproc.q2.Active:=true;
после активации запроса вылетает как раз ошибка. и как я выше писал вылетает ошибка только при попытке сделать это в параллельном потоке