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

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

Ошибка в выполнении параллельного потока [D2005, XP]


Страницы:   1 2 3 4 5 6

ГореПрограммер ©   (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;

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


Страницы:   1 2 3 4 5 6

Наверх

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