Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Форма страшно тормазит во время цикла.  [new]
azz
Member

Откуда: Munchen
Сообщений: 252
Форма запускакт страшный цикл по апдейту Базы данных на пару часов и перестает реагировать. Комп практически виснетю Что делать?
2 июн 04, 15:01    [716766]     Ответить | Цитировать Сообщить модератору
 Re: Форма страшно тормазит во время цикла.  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Приведи код этого старшного цикла.
2 июн 04, 15:08    [716795]     Ответить | Цитировать Сообщить модератору
 Re: Форма страшно тормазит во время цикла.  [new]
azz
Member

Откуда: Munchen
Сообщений: 252
thisform.txtKgsDa.changevalue("Start...")


if thisform.chkKGS_DA.Value = 1

txtSQL ="delete from TKGS_DA"
SQL(txtSQL)

do while substr(theString,1,2) = "KG"
txtVersion = substr(theString,1,9)
dKG_DATUM=substr(theString,16,2)+"."+substr(theString,14,2)+"."+substr(thestring,10,4)
nKG_SCHLUESSEL = substr(theString,18,8)
txtKG_SATZART = substr(theString, 26,1)
txtKG_NAME = substr(theString, 27,40)

txtSQL = "INSERT INTO TKGS_DA(VERSION, KG_DATUM,KG_SCHLUSSEL,KGSATZART,KG_NAME) VALUES('" + tochar(txtVersion)+"','"+dKG_DATUM+"','"+ tochar(nKG_SCHLUESSEL)+"','"+tochar(txtKG_SATZART)+"','"+txtKG_NAME+"')"

SQL(txtSQL)


theString = fgets(DBFile)
theString = theString + fgets(DBFile)
enddo
thisform.txtKgsDa.changevalue("Fertig...")

*Skip
else
thisform.txtKgsDa.changevalue("Uberspringe...")
	do while substr(theString,1,2) = "KG"
		theString = fgets(DBFile)
		theString = theString+fgets(DBFile)		
	enddo
thisform.txtKgsDa.changevalue("Ubersprungen...")
endif
I takih tam 12 schtuk. scego 450 Mb v Bazu skidivau
2 июн 04, 15:29    [716878]     Ответить | Цитировать Сообщить модератору
 Re: Форма страшно тормазит во время цикла.  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
1. В длительных циклах обычно вставляют самописный индикатор прогресса, ну, или запускают какой-то AVI-файл с тем, чтобы пользователь не дергался и видел, что идет процесс и программа не зависла. В простейшем случае, можно просто в начале цикла писать

lnI=m.lnI+1
WAIT WINDOW NOWAIT STR(m.lnI)

2. Если речь идет о командах, посылаемых на сервер, то в циклических командах хорошо зарекомендовали себя команды предварительной компиляции запроса. Посмотрите описание команды SQLPrepare(). Т.е. вместо явного указания значения в команде INSERT указывается набор параметров (через вопросительный знак). Общий код выглядит примерно так:

txtSQL = "INSERT INTO TKGS_DA(VERSION, KG_DATUM,KG_SCHLUSSEL,KGSATZART,KG_NAME) VALUES(?txtVersion, ?dKG_DATUM, ?nKG_SCHLUESSEL, ?txtKG_SATZART, ?txtKG_NAME)"

* Предварительная компиляция запроса на сервере
=SQLPrepare(m.lnCH,m.txtSQL)
* Собственно цикл
DO WHILE ...
txtVersion = ...
dKG_DATUM = ...
nKG_SCHLUESSEL = ...
txtKG_SATZART = ...
txtKG_NAME = ...

=SQLExec(m.lnCH)
ENDDO

3. У тебя очень большое время тратится на формирование значений (fgets). Построчное чтение из текстового файла - это ОЧЕНЬ медленная операция. Используй групповые команды APPEND FROM, чтобы качнуть сразу все из текстового файла во временную таблицу. Потом делай разборку содержимого этой временной таблицы, но тоже через групповые команды, вроде REPLACE FOR или DELETE FOR. А если еще использовать Remote View для записи, то закачка ускорится многократно.
2 июн 04, 16:03    [716995]     Ответить | Цитировать Сообщить модератору
 Re: Форма страшно тормазит во время цикла.  [new]
azz
Member

Откуда: Munchen
Сообщений: 252
Ti mena obsalutno ne ponal....
Vrema raboti ne problema, vrema sostovlenija komandi v hudschem slucae 1/20 ot vremeni peredaci dannih na server.
Da i otobrajenie protsesa mena ne volnuet.
Forma uje napisana, ogromnoe kolicestvo teksta. Perepisivat ejo ctobi sokratit 4 casovuju rabotu programmi na 20 minut ja ne soberaus.
Mne prosto nujno ctob komp ne podvesal, i ctob vo vrema raboti ja mog najat na etoj forme knopku... I vse. Podskaji pojalujsta esli znaesch kak!
2 июн 04, 16:24    [717071]     Ответить | Цитировать Сообщить модератору
 Re: Форма страшно тормазит во время цикла.  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
DOEVENTS - тебе поможет

Просто все методы в FoxPro выполняются "линейно". Невозможно запустить другой процесс, пока не завершится процедура с циклом. Команда DOEVENTS как раз и призвана проверить - нет ли еще какого процесс в очереди и запустить его.

Однако, до VFP7 ее использование еще больше увеличит время выполнения. Если у тебя версия младше 7, то запускай ее с определенным интервалом, раз в 100 итераций цикла, например.
2 июн 04, 17:20    [717253]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить