powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VFP7: "Незаконное" удержание закрытых таблиц...
8 сообщений из 8, страница 1 из 1
VFP7: "Незаконное" удержание закрытых таблиц...
    #33948116
Zero12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересно чего это Фокс так удерживает dbf-ники, созданные (и закрытые!!!) в теле цикла? Даже если установлено SET EXCLUSIVE OFF и таблица создается через CREATE TABLE или через SELECT-SQL, то все равно доступ (на запись или удаление файла) к такому dbf-нику (даже после его закрытия командой USE!) из другого VFP-процесса (или с другого компьютера) ЗАПРЕЩЕН. И этот запрет действует на dbf-ник до завершения цикла, в процессе которого он был создан. Такое впечатление, что команда USE для таких таблиц просто не действует! Никакие формы, библиотеки и объекты при этом не задействованы. И самое главное - такое неоправданное "удержание" касается только таблиц, а вот созданные и закрытые в цикле низкоуровневые файлы ведут себя вполне прилично - с ними из-вне можно проделывать все, что угодно. Ну не создавать же и впрямь dbf-таблицы низкоуровневыми командами (это в Фоксе-то!)?
Вот и хотелось бы узнать, это - устранимо, или это - фишка такая у Фокса?
...
Рейтинг: 0 / 0
VFP7: "Незаконное" удержание закрытых таблиц...
    #33948143
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример кода в студию! Хочется воспроизвести проблему у себя.
...
Рейтинг: 0 / 0
VFP7: "Незаконное" удержание закрытых таблиц...
    #33948205
MFoxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Set Safety Off
Set Multilocks On

Create Table Test ( F1 C ( 30 ) )

lcFullPath =  Dbf( Alias() )
lcAlias =   Juststem(lcFullPath) && Как вариант, тут как хочешь, так и называй под каким алиасом открываешь
Store '' to cRetVal
? pr_ReOpenTableIsShared(lcFullPath,lcAlias,@cRetVal)
? cRetVal
 
* Если таблица открыта в Shared, пиши - обновляй, через RLOCK, FLOCK или через
* TableUpdate( ... ), если конечно переведешь ее в  3  или  5  режим буферизации,
* через CursorSetProp( ... )

Procedure pr_ReOpenTableIsShared( tcNameTable As String, tsNameAlias As String, tcRetErr as String  )
   *  Проверку на валидность tcNameTable, надеюсь, выполните сами
   Local llOkOpenShare As Logical, oExp As Exception, cMsg As String
   Try
      llOkOpenShare  = Used( tsNameAlias ) And Isexclusive( tsNameAlias )
      If  llOkOpenShare
         Use In Select(tsNameAlias )
         Use ( tcNameTable ) In  0  Again Alias ( tsNameAlias ) Shared 
         CursorSetProp ("Buffering", 5 ,tsNameAlias)
      Endif
   Catch To oExp
      tcRetErr = oExp.Message
   Endtry
   Return Empty( tcRetErr  )
Endproc 
...
Рейтинг: 0 / 0
VFP7: "Незаконное" удержание закрытых таблиц...
    #33948278
Zero12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To MFoxer:
Спасибо, завтра попробую разобраться. Может, сработает.

To Urri:
Код подобен тому, что приведен в
http://www.sql.ru/forum/actualfile.aspx?id=3004841
Что-то типа
{Клиентский процесс на Компьютере1}:
SET DEFAULT TO "c:\program files\vfp\prg\0_klnt_srvr"
Home_bd="c:\program files\vfp\prg\0_klnt_srvr\"
CName=SUBSTR(SYS(2015),4) cmd="Набор значений обусловленных переменных для запросов"
WAIT WINDOW [Command: ]+cmd NOWAIT
fh=FCREATE(Home_bd+CName+'.zzz')
=FPUTS(fh,cmd)
=FCLOSE(fh)
Start=Seconds()
Fnd=.F.
DO WHILE(SECONDS()-Start)<15
IF FILE(Home_bd+CName+'.DBF')
Fnd=.T.
a=inkey(0.2)
EXIT
ENDIF
ENDDO
WAIT CLEAR
IF !Fnd
=MessageBox("Никаких данных из сервера не поступило!",64)
RETURN
ENDIF
SELECT (CName)
USE
IF FILE(Home_bd+CName+'.DBF')
DELETE FILE (Home_bd+CName+'.DBF')
ENDIF

**************************************
{Серверный процесс на Компьютере2}:
SET DEFAULT TO "c:\program files\vfp\prg\0_klnt_srvr"
SET EXCLUSIVE OFF
FileList = .F.
DO WHILE .T.
RELEASE FileList
=ADIR(FileList,"*.zzz")
IF TYPE ([FILELIST(1,1)])<>
namDBF=FileList[1,1]
namDBF=LEFT(namDBF,AT(".",namDBF)-1)
fh=FOPEN(namDBF+'.zzz')
cmd=FGETS(fh)
=FCLOSE(fh)
CREATE TABLE &namDBF (a c(40))
INSERT INTO &namDBF (a) VALUES (cmd)
SELECT(namDBF)
? DBF()+"created."
USE
&& или:
CREATE TABLE proba (a c(40))
INSERT INTO proba (a) VALUES (cmd)
IF _Tally > 0
SELECT * from proba INTO TABLE &namDBF
? DBF()+"created."
ENDIF
USE
IF FILE(namDBF+'.zzz')
DELETE FILE (namDBF+'.zzz')
ENDIF
ELSE
? "Никаких запросов не поступило в "+TIME()
ENDIF
a=INKEY(1)
IF LASTKEY()=27
EXIT
ENDIF
ENDDO

Возможно, где-то и допустил "грамматическую ошибку" - воспроизвожу примерно, т.к. сам код сейчас находится на компе на работе, а я пишу сейчас из дому. Но, думаю, сам смысл - понятен. Это, кажется, то от чего предостерегал меня Sergey Ch в предыдущем моем топике, но - партизаны не сдаются :)
...
Рейтинг: 0 / 0
VFP7: "Незаконное" удержание закрытых таблиц...
    #33948312
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну дык это inkey чудит. Еще одно подтверждение: не надо его использовать, т.е. вообще.
Вот так попробуй, а еще лучше создай классы таймера.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
* Сервер
SET DEFAULT TO "c:\"
SET EXCLUSIVE OFF
DO WHILE .T.
  i=ADIR(FileList,"*.zzz")
  IF i> 0 
    fh=FOPEN(FileList( 1 ))
    cmd=FGETS(fh)
    =FCLOSE(fh)
    namDBF = juststem(FileList( 1 ))
    CREATE TABLE (namDBF) (a c( 40 ))
    INSERT INTO (namDBF) (a) VALUES (cmd)
    ? DBF()+"created."
    use in (SELECT(namDBF))
    ERASE (FileList( 1 ))
  ELSE
    ? "Никаких запросов не поступило в "+TIME()
  ENDIF
  wait '' timeout  1 
  IF LASTKEY()= 27 
    EXIT
  ENDIF
ENDDO
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
* Клиент
SET DEFAULT TO "c:\"
Home_bd="c:\"
CName=SUBSTR(SYS( 2015 ), 4 )
cmd="Набор значений обусловленных переменных для запросов"
WAIT WINDOW [Command: ]+cmd NOWAIT
fh=FCREATE(Home_bd+CName+'.zzz')
=FPUTS(fh,cmd)
=FCLOSE(fh)
Start=Seconds()
Fnd=.F.
DO WHILE(SECONDS()-Start)< 5 
  IF FILE(Home_bd+CName+'.DBF')
    Fnd=.T.
    EXIT
  ENDIF
  wait '' timeout . 3 
ENDDO
WAIT CLEAR
IF !Fnd
  =MessageBox("Никаких данных из сервера не поступило!", 64 )
  RETURN
endif
use (CName) in  0 
browse last
SELECT (CName)
USE
IF FILE(Home_bd+CName+'.DBF')
  erase (Home_bd+CName+'.DBF')
ENDIF
...
Рейтинг: 0 / 0
VFP7: "Незаконное" удержание закрытых таблиц...
    #33948504
Zero12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Urri:
Не уверен, что вся загвоздка в Inkey... У меня были проблемы и без него, правда - в другом коде, но тоже - с циклами. Хотя в данной ситуации - может именно Inkey и является "засланным казачком". Ладно попробую Ваш вариант. А вообще, если можно - добавьте чуток подробностей или ссылочку насчет особенностей работы Inkey’я, т.к. в Хелпе, вроде, ничего такого зазорного о нем - нет.
...
Рейтинг: 0 / 0
VFP7: "Незаконное" удержание закрытых таблиц...
    #33949074
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я когда-то имел удовольствие поддерживать программу на FPD с INKEY-ами.
Так вот, в неактивных окнах эта команда вела себя не вполне адекватно (т.е. приходилось окно, в котором было запущено серверное приложение, держать всегда активным, поверх других окон, в которых также были запущены приложения).
Когда идет проверка Вашей клиент-серверной системы на одном ПК в разных процессах, поневоле окно сервера уходит вниз, тогда-то злобная сущность INKEY и проявляется.
Кроме того, INKEY очень грузит процессор - это даже можно промониторить.
Единственное существенное отличие моего кода от Вашего - это замена INKEY на WAIT TIMEOUT (это самое простое, можно также READ TIMEOUT, а в VFP - объект таймер).
Я точных тестов не проводил, но, судя по всему, в VFP алгоритм работы команды INKEY существенно не отличается от FPD, так как проявились траблы, очень похожие на те, с которыми прежде приходилось иметь дело.
Алгоритмы работы WAIT и READ совершенно иные. Они одинаково хорошо работают в активном и неактивном окнах и не грузят процессор.
Конечно, мое замечание в прошломпосте по поводу "не надо использовать INKEY" надо немного поправить. Не надо использовать INKEY для организации задержки. Для этого есть гораздо лучшие способы. Иногда INKEY можно использовать для получения ответа пользователя. Но и тут есть много альтернативных способов.
...
Рейтинг: 0 / 0
VFP7: "Незаконное" удержание закрытых таблиц...
    #33960245
Zero12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Urri:
Спасибо, убедительно. Тем более - после избавления моего кода от INKEYя мне удалось практически полностью наладить черновой (но достаточно стабильно работающий) вариант клиент-серверного обмена.
Правда, пришлось сей обмен организовать через низкоуровневое создание/доступ к "обменным" файлам т.к. с редактированием записи в "зацикленной" таблице не совсем хорошо получается - задолбался подбирать временнЫе настройки VFP7 для обновления/буферизации записей и таблицы в целом: нутром чую, что если их задать в правильном соотношении, то все должно заработать, а так - через раз или два... В конце концов, остановился на "низкоуровневом текстовом" варианте посылки параметров запроса серверу - более "универсально" получается, и работает.
Так что - еще раз спасибо. Прошу считать тему исчерпанной.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VFP7: "Незаконное" удержание закрытых таблиц...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]