Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.28;
Скачать: CL | DM;

Вниз

проблема с BDE или еще чем-то...   Найти похожие ветки 

 
Sergey V. Shadrin   (2002-09-27 09:47) [0]

дано: несколько программ обращается к одной dbf (foxpro"шной, с одной записью) на чтение через bde при обращении приблизительно 6 программы (может пятой, если первая успевает закончить раньше не получается проверить :( ) не получаем доступ к ней на чтение... в чем причина может быть?


 
Desdechado ©   (2002-09-30 11:14) [1]

наверно, открывается таблица в монопольном режиме


 
Sergey V. Shadrin   (2002-09-30 14:17) [2]

нефига. выяснено что такая программа:

unit bde1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, dbtables;

type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
t:ttable;
i:integer;
implementation

{$R *.dfm}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
t.Close;
t.Free;
Application.MessageBox("CA90 closed","Pause wait");
end;

procedure TForm1.FormShow(Sender: TObject);
begin
t:=TTable.Create(nil);
t.DatabaseName:="c:\ca\s";
t.TableName:="ca90.dbf";
t.Open;
Application.MessageBox("CA90 opened","Pause wait");
end;

end.

если ее запустить до состояния "ca90 opened", а потом запустить еще одну копию и так далее всего получается на экране 6 сообщений о ca90, после чего идет ругань: Insufficient memory for this operation. Alias. вот такие вот пироги :( а мне надо чтобы было минимум 15 запусков одновременно... хотя если в одной программе открыть 20 таблиц - все нормально будет. а в разных - не получается.


 
Desdechado ©   (2002-09-30 16:37) [3]

15 экземпляров одной программы одновременно?!
ну ты сказал.
так вопрос в другую плоскость перешел - не получение доступа к дбф, а недостаток памяти. А здесь сразу вижу глюк: создание таблицы на ПОКАЗ формы (вместо создания OnCreate), а уничтожение только на закрытие формы. Может создаваться 50 TTable при 50 показах, а указатели на 49 предыдущих теряются. Вот и освободить память нельзя.


 
Sergey V. Shadrin   (2002-10-01 07:08) [4]

надо чтобы 15 одинаковых программ работало одновременно. здесь же мы имеем всего 6 работающих экземпляров. что для данной задачи не приемлемо. а о том, сколько надо памяти для этого? и где ее крутить? сейчас на машине стоит 256 метров. не думаю, что этого мало.


 
Sergey V. Shadrin   (2002-10-08 08:40) [5]

что никто не знает что ли?


 
Плохиш   (2002-10-08 13:25) [6]

1. Как тебе уже сказали, замени для начала FormShow на FormCreate
2. "Insufficient memory for this operation" тебе перевести?
3. почитай умные книжки оттуда можно почерпнуть много интересной и полезной информации, к примеру, что не всё определяется количеством MB.


 
sniknik ©   (2002-10-08 22:43) [7]

to Desdechado
и остальным кому интересно. память в данном случае совершенно ни причем (я пробовал). ошибка вываливается на 6м открытии таблицы через BDE и только если запуск идет с одной машины. (количество сессий бде ограничено чтоли!). для чистоты эксперимента можно все убрать создание, события, результат не изменится если иметь 1 открытую таблицу.
ошибка звучит полностью так
Exception EDBEngineError in module Project1.exe at 000A18B6.
Insufficient memory for this operation
это при том что в диспечере задачь в этот момент доступно 663240 больше пол гига! кстати после того как искуственно "посадил" память до доступно 53348 то открылось те же пять прог с 1 подключением к таблице.

Плохиш-у - никакие книги не заменят опыта и эксперементаторства. ведь книги не бог пишет который изначально все знает, ктото должен быть первым.


 
sniknik ©   (2002-10-09 01:41) [8]

опять об этом.
ошибка возникает в модуле DBTables
в процедуре procedure TDatabase.DoConnect;
на вызове
Check(DbiOpenDatabase(Pointer(DBName), nil,
DBIOpenMode(Integer(OpenModes[FReadOnly]) or OpenModeFlag),
ShareModes[FExclusive], Pointer(StrToOem(DBPassword)),
OptParamCount, OptFldDesc, OptParam, FHandle));
возврашает ошибку 9473 ->
DBIERR_NOMEMORY = (ERRBASE_LIMIT + ERRCODE_NOMEMORY);
ограничение по памяти именно в модуле BDE. Обычной то памяти дофига.
Может так проще будет. Остается узнать где оно прописано это ограничение, ну или найти того кто знает.



Страницы: 1 вся ветка

Текущий архив: 2002.10.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
6-92630
FATman
2002-08-27 23:02
2002.10.28
Как понять я уже в инете или еще нет?


1-92550
Destroyer
2002-10-16 13:37
2002.10.28
VarArrayCreate


4-92792
Mazenrat
2002-09-16 15:36
2002.10.28
TTimer в API приложении.


14-92716
Rouse_
2002-09-28 00:10
2002.10.28
Мастера улыбаются


1-92431
lann
2002-10-17 17:21
2002.10.28
TWordDocument