![]() |
| ||
|
|
Новости |
Поиск |
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 не в этом потоке, а просто в программе, то никаких ошибок не происходит. Подскажите пожалуйста где искать ошибку ?
ANB (2006-11-08 14:16:00) [21]Для начинающих медленно и 2 раза :
Creates an instance of a thread object.
constructor Create(CreateSuspended: Boolean);
Description
Call Create to create a thread in an application. If CreateSuspended is False, Execute is called immediately. If CreateSuspended is True, Execute won’t be called until after Resume is called.
Anatoly Podgoretsky (2006-11-08 14:13:00) [22]> ГореПрограммер (08.11.2006 13:46:24) [84]
Уже 84 сообщения и ты сто процентов менял код, поэтому говорить о каком то неизвестном коде нет смысла.
Anatoly Podgoretsky (2006-11-08 14:13:00) [23]> ANB (08.11.2006 13:34:23) [83]
А зря, я в последнем проекте долго думал, прежде чем использовать потоки, хотя там мог обойтись и без них и с более высокой надежностью. Пришлось также ограничить возможность запуска одноименного потока, для это организовал пул потоков. Каждый запускается только один раз, при повторном запуске не сможет.
Anatoly Podgoretsky (2006-11-08 14:11:00) [24]> Сергей М. (08.11.2006 13:33:22) [82]
Все гадания.
Anatoly Podgoretsky (2006-11-08 14:10:00) [25]> ГореПрограммер (08.11.2006 13:21:19) [79]
По твоим словам, который запускается много раз вместо одного.
ГореПрограммер (2006-11-08 13:46:00) [26]
> Раз ты убрал все это хозяйство в Synchronize(), то отныне
> та самая твоя "подгрузка" осуществляется в основном потоке
> !
>
> В чем тогда смысл использования параллельного потока ? Ни
> в чем. Его можно смело выбросить в мусор.
Я же писал в первом посте темы что именно мне нужно...
Мне необходимо именно фоном, не мешая работе программы выполнить код, который я предоставлял.
> MyThread := TLoadfon.Create(...);
> MyThread.Execute;
Неоднократно уже писал код запуска ) нет там такого.
ANB (2006-11-08 13:34:00) [27]
> В чем тогда смысл использования параллельного потока ? Ни
> в чем.
Это типа - помудохаться. Ибо круто и модно.
Сергей М. (2006-11-08 13:33:00) [28]И (см. [80]) подозреваю, что у тебя фигурирует такой код :
MyThread := TLoadfon.Create(...);
MyThread.Execute;
?
Сергей М. (2006-11-08 13:31:00) [29]
> один единственный параллельный, который как раз подгружает
> эти данные
Раз ты убрал все это хозяйство в Synchronize(), то отныне та самая твоя "подгрузка" осуществляется в основномпотоке !
В чем тогда смысл использования параллельного потока ? Ни в чем. Его можно смело выбросить в мусор.
ANB (2006-11-08 13:30:00) [30]
> ГореПрограммер (08.11.06 13:21) [79]
1. ИМХО ты доп.поток умудряешься 2 раза запустистить. покажи код запуска потока.
2. Пока доп поток работает - чего главный делать то должен ? Если он без данных, загруженных доп.потоком работать не может - то лучше глянуть в сторону асинхронки, понадежнее будет.
ГореПрограммер (2006-11-08 13:21:00) [31]
> Зачем на словах, у него же явно много потоков запускается,
> ведь именно на это и жалуется.
Нет, есть основной поток, в котором работает вся программа и один единственный параллельный, который как раз подгружает эти данные
Anatoly Podgoretsky (2006-11-08 13:18:00) [32]> Сергей М. (08.11.2006 13:03:17) [77]
Зачем на словах, у него же явно много потоков запускается, ведь именно на это и жалуется.
Сергей М. (2006-11-08 13:03:00) [33]
> изменений внутри этой переменной не происходит
Это все на словах.
А теперь подтверди это реальным кодом ..
ГореПрограммер (2006-11-08 12:56:00) [34]
> И доступ к azap_excel наверно возможен из разных потоков
Да, возможен. но изменений внутри этой переменной не происходит, изменения вносятся в момент выполнения паралельного потока только им.
Сергей М. (2006-11-08 12:48:00) [35]
> Count это просто колличество записей в массиве
Вот так и говори : count - это поленекоей записи)
Что скажешь насчет [73] ?
DVM (2006-11-08 12:31:00) [36]
> Какая же другая, когда это находится в секции public
если public тогда без разницы конечно
Anatoly Podgoretsky (2006-11-08 12:22:00) [37]> ГореПрограммер (08.11.2006 11:17:11) [71]
И доступ к azap_excel наверно возможен из разных потоков
Anatoly Podgoretsky (2006-11-08 12:20:00) [38]> DVM (08.11.2006 10:31:06) [66]
Какая же другая, когда это находится в секции public глобальнее уровня нет.
ГореПрограммер (2006-11-08 11:17:00) [39]
> Сергей М. © (08.11.06 11:06) [70]
Массив динамический. вместо count можно, безусловно, и использовать length, но было изначально сделано так. Count это просто колличество записей в массиве.
rzap_excel=record
id:string;
sat:string;
stat:string;
mac:string;
.....
....
....
end;
azap_excel=record
count:integer;
zaps:array of rzap_excel;
end;
var
ar_excel:azap_excel;
Сергей М. (2006-11-08 11:06:00) [40]
> ar_excel это массив данных типа record
И откуда у массива (!) взялось нечто выглядящее как count ?
Давай уже показывай декларацию ...