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  не в этом потоке, а просто в программе, то никаких ошибок не происходит. Подскажите пожалуйста где искать ошибку ?


DVM   (2006-11-07 14:12:00) [81]

вообще странно, не должно быть если поток заново кто-то не создает.
поставь еще if Terminated then exit; вместо break;


ГореПрограммер   (2006-11-07 14:08:00) [82]


> > ГореПрограммер   (07.11.06 14:04) [26]
>
> ты бип в цикл поставил? цикл работает?

Да, все тоже самое. цикл работает. и после окончания выполняется еще и еще


DVM   (2006-11-07 14:07:00) [83]


> ГореПрограммер   (07.11.06 14:04) [26]

ты бип в цикл поставил? цикл работает?


ГореПрограммер   (2006-11-07 14:04:00) [84]


> Потому что процедура sinform() (в которой твой прогрессбар
> заполняется) у тебя  вызывается ar_excel.count раз

логично. мне и необходимо её выполнить ar_excel.count раз. Но после выполнения её ar_excel.count раз она выполняется опять столько же и так до бесконечности


Сергей М.   (2006-11-07 13:54:00) [85]

Потому что процедура sinform() (в которой твой прогрессбар заполняется) у тебя  вызывается ar_excel.count раз


DVM   (2006-11-07 13:52:00) [86]

Поставь windows.beep(500,50); в цикл


ГореПрограммер   (2006-11-07 13:50:00) [87]


> > потом цикла начинается заново.
>
>
> С чего ты взял ?

procedure tloadfon.sinform;
begin
loadip(ar_excel.zaps[index].mac,index);
getminup(ar_excel.zaps[index].id);
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;
   index:=i;
   Synchronize(sinform);
 end;
fstart.prog1.Position:=0;
fstart.stat.Panels[0].Text:='Все данные загружены';
end;


После окончания заполнения прогресбара. через секунлы 2 он опять начинает заполняться. Логично что еще раз срабатывает цикл


ГореПрограммер   (2006-11-07 13:48:00) [88]


> > showmessage не срабатывает. заканчивается цикл, тишина
> и
> > потом цикла начинается заново.
>
> Происходит исключение, тихое.

А каким образом диагностировать где и какая ошибка ?


Сергей М.   (2006-11-07 13:46:00) [89]


> showmessage не срабатывает


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


> потом цикла начинается заново.


С чего ты взял ?


Anatoly Podgoretsky   (2006-11-07 13:45:00) [90]


> showmessage не срабатывает. заканчивается цикл, тишина и
> потом цикла начинается заново.

Происходит исключение, тихое.


DVM   (2006-11-07 13:41:00) [91]

И все же ar_excel меняется в основном потоке или нет? Лучше создай у объекта потока поле FCount и свойство Count с доступом через критическую секцию. Так понадежнее. Хотя к количеству повторов цикла отношения это вряд ли имеет.


ГореПрограммер   (2006-11-07 13:36:00) [92]


> > index:=i;
>
> Это что еще? Почему меняешь из потока так смело значения
> переменных?

Извиняюсь, это я убрал уже. Результат тот же (


ГореПрограммер   (2006-11-07 13:34:00) [93]

Пробовал так:

> procedure tloadfon.Execute;
> var i:integer;
> begin
> FreeOnTerminate := True;
> for i := 0 to ar_excel.count - 1 do
>   begin
>     if Terminated then
>       Break;
>     index:=i;
>     Synchronize(sinform);
>   end;
> showmessage('test');
> end;


showmessage не срабатывает. заканчивается цикл, тишина и потом цикла начинается заново.


DVM   (2006-11-07 13:34:00) [94]


> index:=i;

Это что еще? Почему меняешь из потока так смело значения переменных?


ГореПрограммер   (2006-11-07 13:31:00) [95]

procedure tloadfon.sinform;
begin
loadip(ar_excel.zaps[index].mac,index);
getminup(ar_excel.zaps[index].id);
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;
   index:=i;
   Synchronize(sinform);
 end;
end;


В execute цикл проходит один раз, потом начинает заново.


Anatoly Podgoretsky   (2006-11-07 13:30:00) [96]

Он и исчезает и ненужный, лишний вызов метода Terminate


DVM   (2006-11-07 13:29:00) [97]


> однократного прохождения цикла

один оборот цикла? Убрать цикл :)

FreeOnTerminate := True;
после отработки Execute он уничтожится.


MetalFan   (2006-11-07 13:28:00) [98]

а нафиг в execute terminate вызывается??
почитай про потоки плз сначала, а потом тут ахинею городи.
неплохая статья, имхо
http://forum.vingrad.ru/topic-60076.html


ГореПрограммер   (2006-11-07 13:26:00) [99]

Да, но в этом случае вопрос. каким образом после однократного прохождения цикла внутри метода поток "исчезал"  ?


Anatoly Podgoretsky   (2006-11-07 13:25:00) [100]


> и смысл вынесения в поток теряется)

А здесь он появляется в проявлении ошибки, и разница то? Небольшая, лучше пусть работает, чем не работает. Может и потоки не нужны.


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

Наверх

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