 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Tor Okt 30, 2007 9:12 pm Naslov sporočila: |
|
|
Silvo je napisal/a: |
Recimo tale tvoja procedura mi osebno deluje čisto domače. FOpen,FWrite,Fseek,Fclose je za binarni dostop do datoteke poznal Clipper že pred 20-timi leti. Procedura v Dosovih časih bi bila napisana skoraj popolnoma enako. Proceduro "BlockWrite" katero je uporabil Aly pa ne poznam. Sem mislil, da je to novejše .... |
'BlockWrite' izvira iz časov, ko še ni bilo pravih operaciskih sistemov temveč so to bili disk operacijski sistemi (DOS). Disk je pač razdeljen na sektorje najkrajša možna dolžina sektorja je 128 byte-ov (normalno se formatira na 512 byte-ov) in toliko posledično tudi znaša 'default' dolžina zapisa funkcije 'BlockWrite'. No, to se je kasneje še vleklo in vleklo tako da tudi Delphi zaradi back-kompatibilnosti še vedno pozna omenjeno funkcijo.
LP GJ |
|
Nazaj na vrh |
|
 |
VolkD Član


 
Pridružen-a: Pet 24 Sep 2004 21:58 Prispevkov: 14228 Aktiv.: 59.91 Kraj: Divača (Kačiče)
|
Objavljeno: Tor Okt 30, 2007 11:42 pm Naslov sporočila: |
|
|
BlockWrite procedura ima še danes svoje prednosti pred ostalimi načini zapisovanja. Je namreč za razred hitrejša. Logično, saj deluje na precej nižjem nivoju kot ostale. Podobno velja za BlockRead. _________________ Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo. |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Sre Okt 31, 2007 9:52 am Naslov sporočila: |
|
|
VolkD je napisal/a: |
BlockWrite procedura ima še danes svoje prednosti pred ostalimi načini zapisovanja. Je namreč za razred hitrejša. Logično, saj deluje na precej nižjem nivoju kot ostale. Podobno velja za BlockRead. |
Tvoja trditev drži le za DOS oziroma enonitne sisteme.
Od Windovs NT dalje ni več tako, BlockWrite in BlockRead sta zgolj simulirani funkciji, kličeta pa WriteFile in ReadFile jedrni funkciji.
Kakršenkoli direkten dostop do trdega diska na nivoju aplikacije programa pod NT in XP ni več dovoljen oziroma mogoč, saj bi s tem razbil optimizacijo branja in pisanja po disku, ki jo nadzira API.
Več nitni operacijski sistemi si tega enostavno ne morejo privoščiti, za pretok podatkov in njihovo optimizacijo branja in pisanja skrbi API (jedro oziroma ring0), kar znatno dvigne hitrost prenosa podatkov na disk in z diska.
WriteFile in ReadFile uporabljajo optimizacijo in 'buffer-je' za svoje delovanje. Pisanje na disk tako ni trenutno temveč ima zakasnitev nekaj 10 ms.
Šele, če kličemo funkcijo FlushFileBuffers ali pa CloseFile ta resnično zapiše stanje fila na disk in se vrne v program.
LP GJ |
|
Nazaj na vrh |
|
 |
VolkD Član


 
Pridružen-a: Pet 24 Sep 2004 21:58 Prispevkov: 14228 Aktiv.: 59.91 Kraj: Divača (Kačiče)
|
Objavljeno: Sre Okt 31, 2007 11:24 am Naslov sporočila: |
|
|
GJ je napisal/a: |
BlockWrite in BlockRead sta zgolj simulirani funkciji, kličeta pa WriteFile in ReadFile jedrni funkciji. |
Drži ! Velja pripomniti, da ima ta simulacija v DOS emulatorju za win xp v primeru, da se gre za datoteke manjše od enega clustra tudi bug, ki ga do sedaj še niso odpravili.
Pri zapisu tako majhne datoteke z funkcijo blockwrite se datoteka na disku sicer ustvari, a je njena vsebina napačna.
Povedano velja torej le za programe, ki so pisani v Borland Pascalu in se izvajajo v DOS emulatorju. _________________ Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo. |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Sre Okt 31, 2007 6:01 pm Naslov sporočila: |
|
|
Za tiste, ki želijo vedeti kaj več o Delphi programiranju priporočam knjigo Delphi 6 Developer's Guide.
Pdf knjige si lahko ogledate na: http://ultra.obuda.kando.hu/~vamossy/HP/D6DG.pdf
LP GJ |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14677 Aktiv.: 61.80
|
Objavljeno: Čet Nov 01, 2007 6:45 pm Naslov sporočila: |
|
|
Vprašanje glede baze. Imam paradoxovo bazo z primarnim in sekundarnim indeksom. V določenem primeru bi rad indekse popolnoma izključil. Je to možno?
Kako je s fizičnim sortiranjem baze? Kako izvede kopiranje objekt BatchMove v primeru kopiranja? A bodo v drugi bazi, kamor se kopira podatki fizično sortirani (v primeru, da obsaja primarni indeks), ali se naredi le kopja baze. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.61 Kraj: Kranj - struževo
|
Objavljeno: Pon Nov 05, 2007 11:33 am Naslov sporočila: |
|
|
GJ, hvala za namig.
Problem, ki je bil še vedno odprt in sem ga komaj sedaj uspešno rešil, pa je z dejansko sintakso Write ukaza.
Recimo da je var S : string;
V tem primeru BlockWrite(FileSave, S, Length(s)); je S pointer na podatke o stringu in ne na dejanski string. Pravilna sintaksa je takšna, da se Write funkciji poda začetek stringa S[0]
torej: BlockWrite(FileSave, S[0], Length(s));
To velja za vse Write funkcije.
GJ je napisal/a: |
Pri Array-ih je podobno. SizeOf(MojArray) vrne dolžino Array-a. |
Ne, SizeOf (MojArray) vrne le velikost enega samega elementa v arrayu. Preizkušeno. To je potrebno pomnožiti še z Length (MojArray) da dobiš dejansko velikost arraya v RAM-u (v bytih). _________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.61 Kraj: Kranj - struževo
|
Objavljeno: Pon Nov 05, 2007 2:47 pm Naslov sporočila: |
|
|
GJ, še nekaj iz Delphi Help-a za FileOpen:
Citiram: |
Note:
Use of the non-native Delphi language file handlers such as FileOpen is not encouraged. These routines map to system routines and return OS file handles, not normal Delphi file variables. These are low-level file access routines. For normal file operations use AssignFile, Rewrite, and Reset instead. |
 _________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Pon Nov 05, 2007 4:40 pm Naslov sporočila: |
|
|
aly je napisal/a: |
GJ, še nekaj iz Delphi Help-a za FileOpen:
Citiram: |
Note:
Use of the non-native Delphi language file handlers such as FileOpen is not encouraged. These routines map to system routines and return OS file handles, not normal Delphi file variables. These are low-level file access routines. For normal file operations use AssignFile, Rewrite, and Reset instead. |
 |
Poudarek je na citiram: 'For normal file operations use AssignFile, Rewrite, and Reset instead'.
FileOpen ni konvecionalna Delfijeva funkcija. Je pa zato AssignFile izpeljan iz ustreznega API klica!
Večina, če ne vsi Delpfijevi objekti uporablajo FileOpen , FileRead, FileWrite itd. za dostop do datotek. Sploh v primeru, če se želimo sprehajati po datoteki hitro in brez problemov.
LP GJ |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14677 Aktiv.: 61.80
|
Objavljeno: Sob Nov 24, 2007 8:57 pm Naslov sporočila: |
|
|
Vsaj eno uro sem iskal vzrok za "ne"znano težavo. Mislim, da je prav, da težavo opišem. Šlo je za cenik s te povezave.
Kaj se je dogajalo? Program sem pisal na namiznem računalniku, včeraj vse skupaj prekopiral na prenosnik. Ker so v rabi baze sem dodal še ustrezne dll-je. Program je na prenosniku delal brez problema. Včeraj sem prenosnik pobasal, ter ga nesel s sabo v službo. V službi hočem pognati cenik - glej ga zlomka - program se sesuje. Ok, sem mislil se je nekaj zgodilo z bazo - snamem vse skupaj s foruma. Program ne dela. Prav, sem mislil. Bom že ugotovil kje je problem. Danes je sledilo še večje presenečenje. Ko sem računalnik vključil doma je program DELAL normalno. Edina možnost - program nekaj "pobira" z računalnika, na katerem je bil ustvarjen. Izključim mrežo - program se sesuje. Moja trditev drži. Odmaknem vse mape ter datoteke v skupni rabi. Računalnik še vedno dela. Ostal je le še tiskalnik. Odmaknem tudi tiskalnik. Program se sesuje. Na prenosniku sem uporabljal tiskalnik, ki je bil v skupni rabi in je bil definiran kot prevzet. Ko sem kot prevzet tiskalnik definiral "Image Writer" je program delal tudi brez mreže.
Vprašanje Delphi "maherjem".
V programu sem uporabil za izpis nekaj objektov QReport-a. Kako pravilno pisati proceduro, da do podobnih težav ne bi prihajalo? Obstaja kaka funkcija, ki prevera stanje tiskalnika? _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Ned Nov 25, 2007 1:36 am Naslov sporočila: |
|
|
Ne 'handlaš' vseh možnih napak!
Nekje ti manjka..
Koda: |
try
...
except
...
end; |
LP GJ |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14677 Aktiv.: 61.80
|
Objavljeno: Ned Nov 25, 2007 1:56 am Naslov sporočila: |
|
|
GJ je napisal/a: |
Ne 'handlaš' vseh možnih napak!
Nekje ti manjka..
Koda: |
try
...
except
...
end; |
LP GJ |
Res, varnostnega bloka v izpisu nisem uporabil - programsko namreč niti ne pride do njega. Program se "zaganja" kakih 5sec nato "crkne". Sploh ne vem, kje naj uporabim varnostni blok. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Ned Nov 25, 2007 2:19 am Naslov sporočila: |
|
|
Takole na pamet, ker ne vem kakšne printer komponente uporabljaš..
Program verjetno poizkuša odpreti dostop do printerja (verjetno preko API klica ali preko kakšne dll), ki pa ga žal neuspešno išče, zato 'raise-a' napako, ki ga posledično sesuje.
V programu (lahko imaš že v sami komponenti) nekje kličeš nekako takole..
moralo pa bi biti..
Koda: |
try
Printer1.Open;
except
...
end; |
No vsaj mislim, da je tako.
LP GJ |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14677 Aktiv.: 61.80
|
Objavljeno: Ned Nov 25, 2007 2:32 am Naslov sporočila: |
|
|
Hvala, bom pogledal popoldan. Sedaj sem v službi. Programa nimam s sabo. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14677 Aktiv.: 61.80
|
Objavljeno: Pet Nov 30, 2007 1:58 pm Naslov sporočila: |
|
|
Kako poinstalirati LCDNumber ?
So potrebne komponente zraven instalacije Delpihija?
"Eksterni" SerialNG za komunikacijo s seriskim portom mi je uspelo namestiti (ne vem točno kako ampak dela)
 _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 7 dni
Powered by phpBB © 2001, 2005 phpBB Group
|