Форум: "Начинающим";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];
ВнизОшибка в выполнении параллельного потока Найти похожие ветки
← →
ГореПрограммер (2006-11-07 12:51) [0]Здравствуйте.
есть клас:
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 12:54) [1]Да, если это имеет значение,
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;
после активации запроса вылетает как раз ошибка. и как я выше писал вылетает ошибка только при попытке сделать это в параллельном потоке
← →
DVM © (2006-11-07 12:58) [2]
> ГореПрограммер (07.11.06 12:51)
> ar_excel
Это чаво такое и почему обращение к этой переменной может быть безопасным?
> loadip(ar_excel.zaps[i].mac,i);
> getminup(ar_excel.zaps[i].id);
Это чаво?
← →
MetalFan © (2006-11-07 13:01) [3]что есть fproc?
ты из потока к VCL компонентам лезешь...
создавай q2 в потоке)
← →
ГореПрограммер (2006-11-07 13:02) [4]
> > 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;
.....
← →
ГореПрограммер (2006-11-07 13:03) [5]
> что есть fproc?
> ты из потока к VCL компонентам лезешь...
> создавай q2 в потоке)
fproc это модуль, в котором содержится q2.
Поток создается в другом модуле
← →
DVM © (2006-11-07 13:05) [6]
> массив записей (record)
Этот массив кем-то чем-то может быть изменен во время отработки потока?
Если да - будут глюки.
> loadip(ar_excel.zaps[i].mac,i);
> getminup(ar_excel.zaps[i].id);
Убирай в Synchronize()
← →
MetalFan © (2006-11-07 13:16) [7]
> DVM © (07.11.06 13:05) [6]
>
> Убирай в Synchronize()
... и смысл вынесения в поток теряется)
← →
ГореПрограммер (2006-11-07 13:18) [8]
> > 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;
не помогло, все равно цикл выполняется еще раз
← →
Сергей М. © (2006-11-07 13:24) [9]
> Мне необходимо чтобы
> > procedure tloadfon.Execute;
>
> выполнилась только один раз
Он (этот метод) всего один раз и выполнится, вне зависимости от того что у него в "потрохах"
← →
Anatoly Podgoretsky © (2006-11-07 13:25) [10]
> и смысл вынесения в поток теряется)
А здесь он появляется в проявлении ошибки, и разница то? Небольшая, лучше пусть работает, чем не работает. Может и потоки не нужны.
← →
ГореПрограммер (2006-11-07 13:26) [11]Да, но в этом случае вопрос. каким образом после однократного прохождения цикла внутри метода поток "исчезал" ?
← →
MetalFan © (2006-11-07 13:28) [12]а нафиг в execute terminate вызывается??
почитай про потоки плз сначала, а потом тут ахинею городи.
неплохая статья, имхо
http://forum.vingrad.ru/topic-60076.html
← →
DVM © (2006-11-07 13:29) [13]
> однократного прохождения цикла
один оборот цикла? Убрать цикл :)
FreeOnTerminate := True;
после отработки Execute он уничтожится.
← →
Anatoly Podgoretsky © (2006-11-07 13:30) [14]Он и исчезает и ненужный, лишний вызов метода Terminate
← →
ГореПрограммер (2006-11-07 13:31) [15]
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 цикл проходит один раз, потом начинает заново.
← →
ГореПрограммер (2006-11-07 13:34) [16]Пробовал так:
> 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) [17]
> index:=i;
Это что еще? Почему меняешь из потока так смело значения переменных?
← →
ГореПрограммер (2006-11-07 13:36) [18]
> > index:=i;
>
> Это что еще? Почему меняешь из потока так смело значения
> переменных?
Извиняюсь, это я убрал уже. Результат тот же (
← →
DVM © (2006-11-07 13:41) [19]И все же ar_excel меняется в основном потоке или нет? Лучше создай у объекта потока поле FCount и свойство Count с доступом через критическую секцию. Так понадежнее. Хотя к количеству повторов цикла отношения это вряд ли имеет.
← →
Anatoly Podgoretsky © (2006-11-07 13:45) [20]
> showmessage не срабатывает. заканчивается цикл, тишина и
> потом цикла начинается заново.
Происходит исключение, тихое.
← →
Сергей М. © (2006-11-07 13:46) [21]
> showmessage не срабатывает
Его обязательно следует синхронизировать с осн.потоком.
> потом цикла начинается заново.
С чего ты взял ?
← →
ГореПрограммер (2006-11-07 13:48) [22]
> > showmessage не срабатывает. заканчивается цикл, тишина
> и
> > потом цикла начинается заново.
>
> Происходит исключение, тихое.
А каким образом диагностировать где и какая ошибка ?
← →
ГореПрограммер (2006-11-07 13:50) [23]
> > потом цикла начинается заново.
>
>
> С чего ты взял ?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 он опять начинает заполняться. Логично что еще раз срабатывает цикл
← →
DVM © (2006-11-07 13:52) [24]Поставь windows.beep(500,50); в цикл
← →
Сергей М. © (2006-11-07 13:54) [25]Потому что процедура sinform() (в которой твой прогрессбар заполняется) у тебя вызывается ar_excel.count раз
← →
ГореПрограммер (2006-11-07 14:04) [26]
> Потому что процедура sinform() (в которой твой прогрессбар
> заполняется) у тебя вызывается ar_excel.count раз
логично. мне и необходимо её выполнить ar_excel.count раз. Но после выполнения её ar_excel.count раз она выполняется опять столько же и так до бесконечности
← →
DVM © (2006-11-07 14:07) [27]
> ГореПрограммер (07.11.06 14:04) [26]
ты бип в цикл поставил? цикл работает?
← →
ГореПрограммер (2006-11-07 14:08) [28]
> > ГореПрограммер (07.11.06 14:04) [26]
>
> ты бип в цикл поставил? цикл работает?
Да, все тоже самое. цикл работает. и после окончания выполняется еще и еще
← →
DVM © (2006-11-07 14:12) [29]вообще странно, не должно быть если поток заново кто-то не создает.
поставь еще if Terminated then exit; вместо break;
← →
ГореПрограммер (2006-11-07 14:19) [30]Поставил. ситуация таже( вызывает create один раз, после строки создания потока поставил showmessage сообщение появляется только один раз
← →
Сергей М. © (2006-11-07 14:25) [31]Отладчиком умеешь пользоваться ?
← →
ГореПрограммер (2006-11-07 14:30) [32]
> Сергей М. © (07.11.06 14:25) [31]
Если ставлю точку остановки на следующую строку после цикла то процесс выполнения не прерывается
← →
Anatoly Podgoretsky © (2006-11-07 14:39) [33]
> if Terminated then exit; вместо break
Смысла нет, масло масляное
← →
Сергей М. © (2006-11-07 14:42) [34]
> fstart.prog1.Position:=0; // <--- сюда ставишь ?
> fstart.stat.Panels[0].Text:="Все данные загружены";
← →
ГореПрограммер (2006-11-07 14:47) [35]Да, именно сюда
← →
Anatoly Podgoretsky © (2006-11-07 14:50) [36]> ГореПрограммер (07.11.2006 14:19:30) [30]
Но ты же именно это и просил, чем теперь недоволен?
← →
Сергей М. © (2006-11-07 14:55) [37]
> FreeOnTerminate := True;
> for i := 0 to ar_excel.count - 1 do //<-- ставь брейкпойнт сюда и - вперед с песней, пошагово, с контролем происходящего после каждого шага
← →
ГореПрограммер (2006-11-07 15:01) [38]
>
> Но ты же именно это и просил, чем теперь недоволен?
Я хотел чтобы цикл выполнился один раз, а не бесконечное число раз
← →
Сергей М. © (2006-11-07 15:03) [39]
> хотел чтобы цикл выполнился один раз, а не бесконечное число
> раз
>
Он и будет выполняться столько раз, сколько ему тобой предписано. Если найдешь и устранишь ошибки. Собственно к данному потоку это не имеет ни малейшего отношения - то же самое можно "накосячить" в любом ином потоке, в т.ч. и основном.
← →
ГореПрограммер (2006-11-07 15:11) [40]
> for i := 0 to ar_excel.count - 1 do
> begin
> if Terminated then
> Break;
> index:=i;
> Synchronize(sinform);
> end;
Да вроде по этому коду он должен выполнится ar_excel.count число раз. а не бесконечно
← →
Сергей М. © (2006-11-07 15:13) [41]
> Synchronize(sinform);
Закомментарь эту строчку - получишь желаемое.
← →
Сергей М. © (2006-11-07 15:17) [42]А если не получишь, то рассказывай подробно, что такое ar_excel, откуда он взялся ..
← →
Anatoly Podgoretsky © (2006-11-07 15:25) [43]> ГореПрограммер (07.11.2006 15:11:40) [40]
Так оно и есть и у меня есть подобные потоки, как написано так и работает - ar_excel.count число раз.
Убери Synchronize
← →
ГореПрограммер (2006-11-07 16:02) [44]
> Так оно и есть и у меня есть подобные потоки, как написано
> так и работает - ar_excel.count число раз.
> Убери Synchronize
>
а как тогда выполнять
> loadip(ar_excel.zaps[index].mac,index);
> getminup(ar_excel.zaps[index].id);
?
← →
Сергей М. © (2006-11-07 16:05) [45]
> ГореПрограммер (07.11.06 16:02) [44]
> а как тогда выполнять
Каком кверху.
Это намек на то, что в одной из этих п/программ у тебя ошибка.
← →
MetalFan © (2006-11-07 16:30) [46]класс ребята! групповая удаленная отладка))))
← →
Anatoly Podgoretsky © (2006-11-07 16:53) [47]> ГореПрограммер (07.11.2006 16:02:44) [44]
Ты убрал? Проблема исчезла или нет?
← →
Anatoly Podgoretsky © (2006-11-07 16:53) [48]> MetalFan (07.11.2006 16:30:46) [46]
Промывание мозгов через одно место
← →
ГореПрограммер (2006-11-07 16:54) [49]
>
> Ты убрал? Проблема исчезла или нет?
да, сейчас пытаюсь понять каким образом SQL запрос может такое вызвать такие последствия...
← →
Сергей М. © (2006-11-07 16:57) [50]сейчас выяснится, что автор слыхом не слыхивал ни про потоконебезопасность объектов доступа к СУБД, ни про Co[Un]Initialize ..
горе-прграммер. одним словом)..
← →
Percent (2006-11-07 16:58) [51]for i := 0 to ar_excel.count - 1 do
begin
if Terminated then
Break;
index:=i;
Synchronize(sinform);
end;
Прикольный "поток"... Чему равно ar_excel.count?
← →
ГореПрограммер (2006-11-07 17:01) [52]
> Прикольный "поток"... Чему равно ar_excel.count?
числу
← →
Сергей М. © (2006-11-07 17:03) [53]
> ГореПрограммер (07.11.06 17:01) [52]
> числу
Да неужели ?!) ... Вот это новость ))
← →
ГореПрограммер (2006-11-07 17:04) [54]
> Да неужели ?!) ... Вот это новость ))
каков вопрос, таков ответ )
← →
Сергей М. © (2006-11-07 17:09) [55]
> ГореПрограммер (07.11.06 17:04) [54]
Ну-ну.
ПРодолжай умничать.
Проблема-то - у тебя, а не у нас.
← →
ГореПрограммер (2006-11-07 17:13) [56]
> Ну-ну.
> ПРодолжай умничать.
>
> Проблема-то - у тебя, а не у нас.
Умничать ? да нет, вроде даже не пытался
> ГореПрограммер (07.11.06 16:54) [49]
>
>
> >
> > Ты убрал? Проблема исчезла или нет?
>
> да, сейчас пытаюсь понять каким образом SQL запрос может
> такое вызвать такие последствия...
← →
MetalFan © (2006-11-07 17:41) [57]
> Сергей М. © (07.11.06 16:57) [50]
>
> сейчас выяснится, что автор слыхом не слыхивал ни про потоконебезопасность
> объектов доступа к СУБД, ни про Co[Un]Initialize ..
>
> горе-прграммер. одним словом)..
это и так уже понятно
← →
ANB © (2006-11-07 18:28) [58]Таки глупый вопрос - а нафига тут вообще поток ? Чтобы был ?
← →
MetalFan © (2006-11-07 18:39) [59]>[58]
я тож так сказал в [7] ;)
← →
ГореПрограммер (2006-11-08 09:33) [60]Смысл в том, чтобы после запуска программы в фоне из базы загружались дополнительные данные, не мешая при этом работе программы.
← →
Сергей М. © (2006-11-08 09:57) [61]
> ГореПрограммер (08.11.06 09:33) [60]
> Умничать ? да нет, вроде даже не пытался
Знач мне показалось) ... Я-то, дурак, думал, что конкретное значение твоих данных типа integer могут быть равными попугаям, авоськам, да всему чему угодно ... А тут вон оно как дело-то певернулось - "числу", оказывается ..)
Мда ..
Ну так ты оттрассировал пошагово проблемный код ?
← →
ГореПрограммер (2006-11-08 10:13) [62]
> Ну так ты оттрассировал пошагово проблемный код ?
В том- то и дело, что да. Ни в одной из тех двух процедур зацикленности не получается. Проверял даже проще: без потока исполнял цикл с этими процедурами, выполнился он корректно.
← →
ГореПрограммер (2006-11-08 10:16) [63]Еще вопрос: а поток должен быть обязательно вынесен в отдельный модуль или это не влияет ?
← →
Anatoly Podgoretsky © (2006-11-08 10:19) [64]
> Смысл в том, чтобы после запуска программы в фоне из базы
> загружались дополнительные данные, не мешая при этом работе
> программы.
Смысл хороший, а реализация.
И случайно не АДО ли ты используешь?
← →
ГореПрограммер (2006-11-08 10:23) [65]
> И случайно не АДО ли ты используешь?
DbExpress
← →
DVM © (2006-11-08 10:31) [66]
> а поток должен быть обязательно вынесен в отдельный модуль
> или это не влияет ?
Не влияет, но когда в одном модуле область видимости другая несколько. Дружественные классы так сказать образуются.
← →
Anatoly Podgoretsky © (2006-11-08 10:58) [67]> DbExpress
А он случайно не использует асинхронные запросы
← →
Сергей М. © (2006-11-08 11:01) [68]
> ГореПрограммер (08.11.06 10:13) [62]
Тогда рассказывай, с какой луны у тебя свалился ar_excel ..
← →
ГореПрограммер (2006-11-08 11:03) [69]ar_excel это массив данных типа record
Данные загружаются при запуске программы после запуска мне необходимо для уже загруженных данных подгрузить несколько полей из базы данных.
← →
Сергей М. © (2006-11-08 11:06) [70]
> ar_excel это массив данных типа record
И откуда у массива (!) взялось нечто выглядящее как count ?
Давай уже показывай декларацию ...
← →
ГореПрограммер (2006-11-08 11:17) [71]
> Сергей М. © (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;
← →
Anatoly Podgoretsky © (2006-11-08 12:20) [72]> DVM (08.11.2006 10:31:06) [66]
Какая же другая, когда это находится в секции public глобальнее уровня нет.
← →
Anatoly Podgoretsky © (2006-11-08 12:22) [73]> ГореПрограммер (08.11.2006 11:17:11) [71]
И доступ к azap_excel наверно возможен из разных потоков
← →
DVM © (2006-11-08 12:31) [74]
> Какая же другая, когда это находится в секции public
если public тогда без разницы конечно
← →
Сергей М. © (2006-11-08 12:48) [75]
> Count это просто колличество записей в массиве
Вот так и говори : count - это поле некоей записи)
Что скажешь насчет [73] ?
← →
ГореПрограммер (2006-11-08 12:56) [76]
> И доступ к azap_excel наверно возможен из разных потоков
Да, возможен. но изменений внутри этой переменной не происходит, изменения вносятся в момент выполнения паралельного потока только им.
← →
Сергей М. © (2006-11-08 13:03) [77]
> изменений внутри этой переменной не происходит
Это все на словах.
А теперь подтверди это реальным кодом ..
← →
Anatoly Podgoretsky © (2006-11-08 13:18) [78]> Сергей М. (08.11.2006 13:03:17) [77]
Зачем на словах, у него же явно много потоков запускается, ведь именно на это и жалуется.
← →
ГореПрограммер (2006-11-08 13:21) [79]
> Зачем на словах, у него же явно много потоков запускается,
> ведь именно на это и жалуется.
Нет, есть основной поток, в котором работает вся программа и один единственный параллельный, который как раз подгружает эти данные
← →
ANB © (2006-11-08 13:30) [80]
> ГореПрограммер (08.11.06 13:21) [79]
1. ИМХО ты доп.поток умудряешься 2 раза запустистить. покажи код запуска потока.
2. Пока доп поток работает - чего главный делать то должен ? Если он без данных, загруженных доп.потоком работать не может - то лучше глянуть в сторону асинхронки, понадежнее будет.
← →
Сергей М. © (2006-11-08 13:31) [81]
> один единственный параллельный, который как раз подгружает
> эти данные
Раз ты убрал все это хозяйство в Synchronize(), то отныне та самая твоя "подгрузка" осуществляется в основном потоке !
В чем тогда смысл использования параллельного потока ? Ни в чем. Его можно смело выбросить в мусор.
← →
Сергей М. © (2006-11-08 13:33) [82]И (см. [80]) подозреваю, что у тебя фигурирует такой код :
MyThread := TLoadfon.Create(...);
MyThread.Execute;
?
← →
ANB © (2006-11-08 13:34) [83]
> В чем тогда смысл использования параллельного потока ? Ни
> в чем.
Это типа - помудохаться. Ибо круто и модно.
← →
ГореПрограммер (2006-11-08 13:46) [84]
> Раз ты убрал все это хозяйство в Synchronize(), то отныне
> та самая твоя "подгрузка" осуществляется в основном потоке
> !
>
> В чем тогда смысл использования параллельного потока ? Ни
> в чем. Его можно смело выбросить в мусор.
Я же писал в первом посте темы что именно мне нужно...
Мне необходимо именно фоном, не мешая работе программы выполнить код, который я предоставлял.
> MyThread := TLoadfon.Create(...);
> MyThread.Execute;
Неоднократно уже писал код запуска ) нет там такого.
← →
Anatoly Podgoretsky © (2006-11-08 14:10) [85]> ГореПрограммер (08.11.2006 13:21:19) [79]
По твоим словам, который запускается много раз вместо одного.
← →
Anatoly Podgoretsky © (2006-11-08 14:11) [86]> Сергей М. (08.11.2006 13:33:22) [82]
Все гадания.
← →
Anatoly Podgoretsky © (2006-11-08 14:13) [87]> ANB (08.11.2006 13:34:23) [83]
А зря, я в последнем проекте долго думал, прежде чем использовать потоки, хотя там мог обойтись и без них и с более высокой надежностью. Пришлось также ограничить возможность запуска одноименного потока, для это организовал пул потоков. Каждый запускается только один раз, при повторном запуске не сможет.
← →
Anatoly Podgoretsky © (2006-11-08 14:13) [88]> ГореПрограммер (08.11.2006 13:46:24) [84]
Уже 84 сообщения и ты сто процентов менял код, поэтому говорить о каком то неизвестном коде нет смысла.
← →
ANB © (2006-11-08 14:16) [89]Для начинающих медленно и 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.
← →
ANB © (2006-11-08 14:18) [90]Соответственно код :
tloadfon.create(false);
заставит поток запустится 1 раз
а
tloadfon.Resume - второй.
← →
ГореПрограммер (2006-11-08 14:19) [91]
Tloadfon = class(TThread)
private
index:integer;
protected
procedure sinform;
procedure Execute; override;
end;
....
procedure tloadfon.sinform;
begin
loadip(ar_excel.zaps[index].mac,index);
ar_excel.zaps[index].firstup:=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
exit;
index:=i;
Synchronize(sinform);
end;
fstart.prog1.Position:=0;
fstart.stat.Panels[0].Text:="Все данные загружены";
end;
.....
вызов:
stat.Panels[0].Width:=10;
stat.Panels[0].Text:="Идет подгрузка вспомогательных данных";
prog1.Position:=0;
prog1.Max:=ar_excel.count;
tloadfon.Create(false);
if ar_excel.count>0 then
begin
tabterm.RowCount:=k22+1;
tabterm22.RowCount:=k3-k22+1;
......
← →
ANB © (2006-11-08 14:26) [92]
> ГореПрограммер (08.11.06 14:19) [91]
а теперь еще неплохо было бы код procedure sinform запостить. Кистате,
procedure tloadfon.Execute;
var i:integer;
begin
FreeOnTerminate := True; // Тута, имхо, смысла не имеет. Хотя мастера поправят, если не так.
И
← →
ГореПрограммер (2006-11-08 14:27) [93]
> а теперь еще неплохо было бы код procedure sinform запостить.
> Кистате,
он там написан.
← →
Сергей М. © (2006-11-08 14:29) [94]
> ANB © (08.11.06 14:18) [90]
>
> Соответственно код :
> tloadfon.create(false);
> заставит поток запустится 1 раз
> а
> tloadfon.Resume - второй.
>
Ну ерунду же несешь)
> ГореПрограммер (08.11.06 14:19) [91]
Ну и какого ляда ты опять обращаешься к виз.объектам без синхронизации ?
← →
ANB © (2006-11-08 14:34) [95]
> ГореПрограммер (08.11.06 14:27) [93]
А. точно. слилось - не заметил.
fstart.prog1.Position:=0;
fstart.stat.Panels[0].Text:="Все данные загружены";
вот это тоже желательно синхронизить.
И где то ты его сам еще раз стартуешь - чудес не бывает. Смотри весь код.
Для очистки совести скинь лог в файл. И время выстави. Тока сообщения поставь в начале execute, в конце и в теле цикла.
← →
Anatoly Podgoretsky © (2006-11-08 14:57) [96]> ГореПрограммер (08.11.2006 14:19:31) [91]
Весь код крутится в контексте главного потока, отсюда выводы
1. читал Архангельского
2. потоки не нужны.
← →
Anatoly Podgoretsky © (2006-11-08 14:58) [97]> ANB (08.11.2006 14:26:32) [92]
Не только, вот это ar_excel.zaps похоже на свойство, а оно может быть контролируемым.
← →
Anatoly Podgoretsky © (2006-11-08 14:59) [98]> ГореПрограммер (08.11.2006 14:27:33) [93]
Зато есть loadip
← →
Anatoly Podgoretsky © (2006-11-08 15:01) [99]> ANB (08.11.2006 14:18:30) [90]
> tloadfon.Resume - второй.
в приведеном обрывке кода не наблюдается
← →
ГореПрограммер (2006-11-08 15:09) [100]
> вот это тоже желательно синхронизить.
>
> И где то ты его сам еще раз стартуешь - чудес не бывает.
> Смотри весь код.
убрал, добавил в синхронизацию
> И где то ты его сам еще раз стартуешь - чудес не бывает.
> Смотри весь код.
если из синхронизации убрать функции выборки из базы, все выполняется корректно и один раз.
> Anatoly Podgoretsky © (08.11.06 14:57) [96]
>
> > ГореПрограммер (08.11.2006 14:19:31) [91]
>
> Весь код крутится в контексте главного потока, отсюда выводы
>
> 1. читал Архангельского
> 2. потоки не нужны.
>
Тогда очередной глупый вопрос:
каким образом реализовать фоновую загрузку данных из базы ?
> Anatoly Podgoretsky © (08.11.06 14:59) [98]
>
> > ГореПрограммер (08.11.2006 14:27:33) [93]
>
> Зато есть loadip
Так он и был раньше
← →
Сергей М. © (2006-11-08 15:13) [101]
> ГореПрограммер (08.11.06 15:09) [100]
>
>
Ты вообще понимаешь, что такое в дан.контексте "синхронизация" и что при оной происходит ?
Объясни своими словами, если понимаешь ...
← →
ANB © (2006-11-08 15:15) [102]
> Тогда очередной глупый вопрос:
> каким образом реализовать фоновую загрузку данных из базы
> ?
А зачем ее делать в отдельном потоке, если достаточно маленькими кусочками и Application.ProcessMessages ?
← →
Сергей М. © (2006-11-08 15:22) [103]
> ANB © (08.11.06 15:15) [102]
Опять же ерунду городишь.
Не всякая СУБД реализует асинхронные режимы, поэтому использование доп.потоков в ряде случаев вполне оправдано
← →
ГореПрограммер (2006-11-08 15:22) [104]
> Ты вообще понимаешь, что такое в дан.контексте "синхронизация"
> и что при оной происходит ?
>
> Объясни своими словами, если понимаешь ...
На сколько я понимаю это синхронизация методов текущего потока с главным VCL потоком.
← →
Сергей М. © (2006-11-08 15:25) [105]
> ГореПрограммер (08.11.06 15:22) [104]
> На сколько я понимаю это синхронизация методов текущего
> потока с главным VCL потоком
Не подлежит сомнению.
А что собственно происходит при этом ? Вот в чем вопрос к тебе ...
← →
ANB © (2006-11-08 16:12) [106]
> Сергей М. © (08.11.06 15:22) [103]
А асинхронка нужна далеко не всегда, если запрос оптимизен, то больше времени уходит на перекачку ответов. Вот этот перебор и разбить на кусочки.
← →
ANB © (2006-11-08 16:14) [107]А авторские запросы вообще есть смысл запихать в один, да заодно и параметризировать. И асинхронка/потоки не нужны будут.
← →
Сергей М. © (2006-11-08 16:19) [108]
> ANB © (08.11.06 16:12) [106]
> асинхронка нужна далеко не всегда
"нужна", "не нужна" .. "оптимизен", "не оптимизен"
НЕТ ничего этого, предположим) ... СУБД не позволяет)
Что дальше ?
Дальше - копание могилы в виде доп.потоков)
← →
ANB © (2006-11-08 17:37) [109]
> СУБД не позволяет)
СУБД не позволяет грамотно проектировать БД и оптимизить запросы, чтобы они не грузились по полчаса ?
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];
Память: 0.72 MB
Время: 0.043 c