Posted By: Keson (Keson) on 'CZprogram'
Title: Re: vic jak 15 souboru....
Date: Mon Dec 2 20:15:16 1996
Ahoj,
> Po 15 otevrenem souboru vam to hodis stejne jako me :"Too many open files" i
Od M$-DOSu verze asi tak 3.3 je dostupna funkce 67H: Set File Handle Count
Expects AH 67H
BX desired maximum number of handles (up to ffffH)
----------------------------------------------------------------
Returns AX error code if CF is set to CY
No a tak kdyz ji zavolas, tak se ti (dal li Panbu) vytvori pozadovanej
pocet fajl-handlu (rek bych ze maximalne 255) a muzes otevrit vic souboru.
V Pascalu muze nastat problem s pameti. DOS totiz pri volani fce 67H
potrebuje alokovat patricnou pamet pro sebe a pukud Pas.program vyuziva
vsechnu pro sebe, tak to krachne.
Da se to resit tak, ze bud nevyuzijes vsechnu pamet {$M 4096,0,1024}
nebo pomoci dos. fce 4aH zmencis blok pameti vyuzivany packalem.
V tom pripade musis zmensit i HeapEnd ukazujici na konec Heapu.
Keson
Priklad: Pozor !!! psal jsem to ted' a dost narychlo
a urcite tam bude mooooooooooooooooc CHYB.
<---------------------------------------------------------------->
UNIT FHndls; {Sets number of file-handles to HANDLES_COUNT
Freeware by T. Jirka 1996
NO WARANTY !!!}
INTERFACE
IMPLEMENTATION
CONST
HANDLES_COUNT = 40;
MEM_NEEDED = ((HANDLES_COUNT * 2 - 1) Div 16) + 1; {in paragraphs}
TYPE
MCB_T = Record {Memory Control Block}
MCB_Type : Char;
Owner : Word;
Size : Word;
IDN : Array[1..$B] Of Char; {Process name (I think)}
End;
VAR
pMcb : ^MCB_T;
PROCEDURE Error;
BEGIN
WriteLn(#7'Chyba v unitu FHndls');
Halt(1);
END; {Error}
PROCEDURE Inc_Handles;
VAR
My_MCB_Size : Word;
BEGIN {Inc_Handles}
{Test Heap}
If (HeapPtr <> HeapOrg) Or (Ofs(HeapOrg^) <> 0) Or
(Ofs(HeapEnd^) <> 0) Then Error;
If Seg(HeapEnd^) - Seg(HeapOrg^) < MEM_NEEDED Then Error;
{Shrink Heap}
HeapEnd := Ptr(Seg(HeapEnd^) - MEM_NEEDED, 0);
pMCB := Ptr(PrefixSeg-1,0);
My_MCB_Size := pMCB^.Size - MEM_NEEDED;
Asm
mov AH,4ah {** Shrink MCB **}
mov ES,PrefixSeg
mov BX,My_MCB_Size
int 21h
jnc @GoOn
Call Error;
@GoOn:
mov AH,67h {** Create new File handles **}
mov BX,HANDLES_COUNT
int 21h
jnc @Konec
Call Error;
@Konec:
End;
END; {Inc_Handles}
BEGIN {Main}
asm
mov AH,67h {** Create new File handles **}
mov BX,HANDLES_COUNT
int 21h
jnc @Konec {No Error}
cmp AX,8 {Error - insufficient memory}
je @FreeMem
Call Error;
@FreeMem:
Call Inc_Handles; {Free some bytes from heap}
@Konec:
end;
END.
<------------------------------------------------------------------------>