![]() |
| ||
|
|
Новости |
Поиск |
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 не в этом потоке, а просто в программе, то никаких ошибок не происходит. Подскажите пожалуйста где искать ошибку ?
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]
> и смысл вынесения в поток теряется)
А здесь он появляется в проявлении ошибки, и разница то? Небольшая, лучше пусть работает, чем не работает. Может и потоки не нужны.