/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
FileCopy "status" problem
Fra : Neo.dk


Dato : 11-10-02 10:07

Nå så er den gal igen

Følgende er en lille snut fra mit installations program.

I snutten kopieres alle filer fra app.path\dwg til destination folder
defineret i Text1 -
Og det fungerer da sådan ca. også godt nok

.... men følgende linie kan jeg ikke få til at fungere !

LabStatus = "Now Copying AutoCAD Drawing" & " " & File1

Der bliver først skrevet i lablen LabStatus når filerne er kopieret, og så
er fidusen ligesom forsvundet

LabStatus skal fungere som en simpel "statusbar" ... jeg ønsker ikke at
tilknytte componenter til formen !

Er der nogen der har et bud på hvorfor LabStatus ikke løbende bliver
"opdateret" ?

Med Venlig hilsen Neo




'Her kopieres alle filer i \dwg

If Right(App.Path, length:=1) = "\" Then
File1.Path = App.Path & "dwg"
Else
File1.Path = App.Path & "\dwg"
End If

Dim SourceFile, DestinationFile
Dim Count
Dim NumFiles As Integer

NumFiles = File1.ListCount - 1 'antal filer i det givne bibliotek
For Count = 0 To NumFiles

File1.ListIndex = Count 'navn
LabStatus = "Now Copying AutoCAD Drawing" & " " & File1

SourceFile = File1.Path & "\" & File1 ' Define source file name.
DestinationFile = Text1 & "\dwg\" & File1 ' Define target file name.

FileCopy SourceFile, DestinationFile ' Copy source to target.
Next Count



 
 
Helge Bjørkhaug (11-10-2002)
Kommentar
Fra : Helge Bjørkhaug


Dato : 11-10-02 10:39

On Fri, 11 Oct 2002 11:07:24 +0200, "Neo.dk"
<neo___dk@hotmail.removethis.com> wrote:

>Nå så er den gal igen
>
>Følgende er en lille snut fra mit installations program.
>
>I snutten kopieres alle filer fra app.path\dwg til destination folder
>defineret i Text1 -
>Og det fungerer da sådan ca. også godt nok
>
>... men følgende linie kan jeg ikke få til at fungere !
>
> LabStatus = "Now Copying AutoCAD Drawing" & " " & File1
>
>Der bliver først skrevet i lablen LabStatus når filerne er kopieret, og så
>er fidusen ligesom forsvundet
>
>LabStatus skal fungere som en simpel "statusbar" ... jeg ønsker ikke at
>tilknytte componenter til formen !
>
>Er der nogen der har et bud på hvorfor LabStatus ikke løbende bliver
>"opdateret" ?

LabStatus = "Now Copying AutoCAD Drawing" & " " & File1
LabStatus.Refresh

Maybe.......

--
Snutten
Reply-to adressen er gyldig inntil spam er mottatt

Jan V. (11-10-2002)
Kommentar
Fra : Jan V.


Dato : 11-10-02 10:41


"Neo.dk" <neo___dk@hotmail.removethis.com> skrev i en meddelelse
news:3da69450$0$79645$edfadb0f@dspool01.news.tele.dk...
> Nå så er den gal igen
>
> Følgende er en lille snut fra mit installations program.
>
> I snutten kopieres alle filer fra app.path\dwg til destination folder
> defineret i Text1 -
> Og det fungerer da sådan ca. også godt nok
>
> ... men følgende linie kan jeg ikke få til at fungere !
>
> LabStatus = "Now Copying AutoCAD Drawing" & " " & File1
>
> Der bliver først skrevet i lablen LabStatus når filerne er kopieret, og så
> er fidusen ligesom forsvundet
>
> LabStatus skal fungere som en simpel "statusbar" ... jeg ønsker ikke at
> tilknytte componenter til formen !
>
> Er der nogen der har et bud på hvorfor LabStatus ikke løbende bliver
> "opdateret" ?
>
> Med Venlig hilsen Neo
>
>
>
>
> 'Her kopieres alle filer i \dwg
>
> If Right(App.Path, length:=1) = "\" Then
> File1.Path = App.Path & "dwg"
> Else
> File1.Path = App.Path & "\dwg"
> End If
>
> Dim SourceFile, DestinationFile
> Dim Count
> Dim NumFiles As Integer
>
> NumFiles = File1.ListCount - 1 'antal filer i det givne bibliotek
> For Count = 0 To NumFiles
>
> File1.ListIndex = Count 'navn
> LabStatus = "Now Copying AutoCAD Drawing" & " " & File1
>
> SourceFile = File1.Path & "\" & File1 ' Define source file name.
> DestinationFile = Text1 & "\dwg\" & File1 ' Define target file name.
>
> FileCopy SourceFile, DestinationFile ' Copy source to target.
> Next Count
>
Prøv at sætte en DoEvents efter LabStatus = ....

Jan



Tomas Christiansen (11-10-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 11-10-02 22:32

Jan V. skrev:
> Prøv at sætte en DoEvents efter LabStatus = ....

Av - av - av. Pas på med de "DoEvents".

Det vil godt nok løse Neo's problemer lige nu, men kan lige så let
skabe nye, hvis han ikke har HELT styr på hvad DoEvents gør eller kan
gøre!

-------
Tomas


Jan V. (14-10-2002)
Kommentar
Fra : Jan V.


Dato : 14-10-02 08:27


"Tomas Christiansen" <toc-nospam-01@blikroer.dk> skrev i en meddelelse
news:ao7fvs$3h9$1@news.cybercity.dk...
> Jan V. skrev:
> > Prøv at sætte en DoEvents efter LabStatus = ....
>
> Av - av - av. Pas på med de "DoEvents".
>
> Det vil godt nok løse Neo's problemer lige nu, men kan lige så let
> skabe nye, hvis han ikke har HELT styr på hvad DoEvents gør eller kan
> gøre!
>
> -------
> Tomas
>
Jeps

Man kan hurtig gøre en effektiv procedure MEGET langsom, hvis man sætter
DoEvents hver gang den løbes igennem.

Men det var nu opdateringen jeg tænkte på - den kommer ikke uden DoEvents.

Jan



Krabsen (14-10-2002)
Kommentar
Fra : Krabsen


Dato : 14-10-02 09:07

Er der en venlig sjæl, der kan uddybe farerne ved DoEvents lidt?

Jeg naive sjæl har opfattet DoEvents sådan, at den 'frigiver' Windows til at
gøre evt. andre processer færdige, inden den går videre.
Derfor bruger jeg typisk kommandoen, hver gang jeg sender en Sql over i
Access - for at sikre, at Access-motoren bliver færdig, inden VB drøner
vider.

Men det er måske _helt_ ude i hampen?

mvh

Krabsen


>
> "Tomas Christiansen" <toc-nospam-01@blikroer.dk> skrev i en meddelelse
> news:ao7fvs$3h9$1@news.cybercity.dk...
> > Jan V. skrev:
> > > Prøv at sætte en DoEvents efter LabStatus = ....
> >
> > Av - av - av. Pas på med de "DoEvents".
> >
> > Det vil godt nok løse Neo's problemer lige nu, men kan lige så let
> > skabe nye, hvis han ikke har HELT styr på hvad DoEvents gør eller kan
> > gøre!
> >
> > -------
> > Tomas
> >
> Jeps
>
> Man kan hurtig gøre en effektiv procedure MEGET langsom, hvis man sætter
> DoEvents hver gang den løbes igennem.
>
> Men det var nu opdateringen jeg tænkte på - den kommer ikke uden
DoEvents.
>
> Jan
>



Tomas Christiansen (14-10-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 14-10-02 22:51

Krabsen skrev:
> Er der en venlig sjæl, der kan uddybe farerne ved DoEvents lidt?

Naturligvis.

> Jeg naive sjæl har opfattet DoEvents sådan, at den 'frigiver'
Windows til at
> gøre evt. andre processer færdige, inden den går videre.

Nej, det er ikke Windows der er problemet (Windows ER et problem, men
ikke i denne sammenhæng), det er den måde VB serialiserer (afvikler)
tingene på.

VB har en slags besked (~opgave) kø, hvor den modtager beskeder om
hvad der skal gøres. Der kan kun udføres én ting ad gangen. Denne
begrænsning ligger i VB og ikke i Windows, som sagtens kan køre flere
ting på samme tid. Begrænsningen sikrer at den samme stump VB-kode
ikke bliver kaldt igen og igen inden den når at afvikle færdig. Det
sikrer også at der aldrig bliver afviklet noget VB-kode "midt i" at
noget andet kode er under afvikling (med de undtagelser som altid skal
til for at bekræfte reglen...)

Når du skriver noget kode i f.eks. Command1_Click event-proceduren,
kan du altså være sikker på at Command2_Click ikke lige pludselig
bliver udført før Command1_Click er færdig afviklet. Brugerens klik på
Command2 (eller andre kontroller) bliver lagt i besked-køen, og bliver
først taget i betragning, når der ikke er andet at lave. Det samme
gælder f.eks. for Timer-events, hvilket resulterer i at Timer-events
kan "forsvinde" ud i det blå, hvis der når at komme et nyt
Timer-event, inden Timer-event proceduren er færdigafviklet (der
"huskes" nogle få events af samme type - præcis hvor mange ved jeg
ikke).

Hvis du opdaterer det synlige indhold af en kontrol på din form,
f.eks. Label1.Caption = "Noget nyt", lægges en besked om at dens
synlige del på skærmen skal opdateres. Denne besked bliver, ligesom
det gælder for alle andre beskeder, først behandlet, når VB ikke har
mere kode at udføre. En uendelig løkke i dit program resulterer altså
i at programmet, set fra brugerens synspunkt, er "låst" - det reagerer
ikke på tastetryk eller museklik og formen og dens indhold bliver ikke
opdateret på skærmen.

Heldigvis har de fleste kontroller en Refresh metode, som øjeblikkelig
opdaterer den synlige del af den pågældende kontrol (eller alle
kontroller på formen hvis det er formens Refresh som kaldes).

Hvad er så lige at DoEvents gør?

Jo, DoEvents suspenderer afviklingen af den aktuelle VB-kode og
behandler det, som måtte ligge i besked-køen. Først når besked-køen er
færdigbehandlet (det er vist ikke klart defineret om ALT bliver udført
eller "det meste" eller "en del", men generelt skal man regne med at
ALT i besked-køen bliver udført), genoptages afviklingen af den
suspenderede kode.

Hvordan kan det være så farligt?

Der er ganske mange ting, som kan gå galt. Hvis f.eks. at din
Command1_Click ser således ud:

Private Sub Command1_Click()
m_lCount = m_lCount + 1 'Global variabel
DoEvents
MsgBox "Dette er " & m_lCount & ". gang"
End Sub

Hvis man klikker hurtigt flere gange efter hinanden på Command1, vil
man kunne risikere at programmet fortæller at:

Nu er det 5. gang
Nu er det 5. gang
Nu er det 5. gang
Nu er det 5. gang
Nu er det 5. gang

Hvorfor nu det?

Jo: Et klik behandles. Den globale variabel bliver talt én op.
Afviklingen bliver suspenderet. Et nyt klik behandles. Den globale
variabel bliver talt én op. Afviklingen bliver suspenderet. Et klik
behandles. Den globale variabel bliver talt én op. Afviklingen bliver
suspenderet... osv.

Det kan altså være forbundet med en alvorlig risiko at ændre på
_nogetsomhelst_ globalt (det være sig variabler, indhold af
kontroller, andre objekter, database, ...) hvis man bruger DoEvents,
og IKKE har sikret sig, at ens kode ikke bliver kaldt igen.

Et andet eksempel kan være at brugeren har tre knapper: En
backup-knap, en slet-knap og en restore-knap.
Det handler om indholdet af et bibliotek, som der kan tages en kopi af
(backup), filerne kan blive slettet eller filerne kan genskabes fra
kopien.

Backup-rutinen ser således ud:

Sub Backup()
For Each File In Directory
Label1 = "Tager kopi af filen " & File.Name
DoEvents
MakeBackup File
Next
End Sub

Slet-rutinen ser sålede ud:

Sub Slet()
Label1 = "Sletter alle filerne"
For Each File In Directory
SletFil File
Next
End Sub

Hvis brugeren trykker på Backup-knappen, og _inden_ kopieringen af
filerne er færdig, kommer til at trykke på Slet-knappen, vil alle
filerne blive slettet midt i det hele, og backup'en er ikke komplet.

Hvis DoEvents i stedet var erstatte af Label1.Refresh, ville der ingen
skade ske, idet procduren Slet ikke ville bliver udført før procedure
Backup var helt færdig.

Håber at det gav en vis forståelse for hvad DoEvents gør, og hvorfor
den kan være så farlig.
Naturligvis kan man i de viste eksempler let sikre sig mod at der kan
klikkes på knapperne flere gange, idet de blot disables ved starten af
en klik-event-rutine og enables igen ved slutningen af en
klik-event-rutine (hvilket man iøvrigt altid bør gøre), men det kræver
at man ved hvad der kræves, og hvis f.eks. DoEvents ligger skjult i en
ekstern ActiveX-DLL, kan det være svært at gennemskue problemerne!

-------
Tomas


Tomas Christiansen (15-10-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 15-10-02 06:40

Tomas Christiansen skrev:
> Nej, det er ikke Windows der er problemet (Windows ER et problem, men
> ikke i denne sammenhæng), det er den måde VB serialiserer (afvikler)
> tingene på.

Jeg var vist lidt upræcis på netop dette punkt.

De ældre Windows-versioner, benyttede sig af en form for kooperativ multiprocessering (multitaskting) eller frivillig processkift,
hvor hver enkeltproces, selv skulle afgøre hvornår det var tid til at "slippe" CPU'en for en stund, så de andre programmer kunne
komme til. Dette kunne man så sikre sig ske, ved at indsætte DoEvents passende steder i sin kode.

I nyere versioner af Windows, benyttes ikke længere frivillig processkift, men derimod _tvungen_ processkift (preemptive
multitasking - ja, kært barn har _mange_ navne), som sikrer at alle "kommer til mølle" og at ingen bliver "udsultet".

Grundet Microsofts åbenbart helt utrolig dårlige implementation af preemptive multitasking - selv i Windows 2000 - kan man dog
stadig observere programmer, kørende med "normal" prioritet, tage alle ressourcer fra stort set alle andre programmer, så computeren
i lange perioder "låser" helt op. Dette burde naturligvis ikke kunne lade sig gøre, hvis man havde skelet blot en lille bitte smule
til mainframe-verdenen, hvor den slags ikke har været den store kunst i 25 år - suk, Microsoft...

Dem som har prøvet at køre med Windows NT, Windows 2000 (og formentlig Windows XP) på en computer med 2 CPU'er, vil kunne tale med
om at spørgsmålet om 1 eller 2 CPU'er _virkelig_ gør en forskel (systemet kører som en "drøm"!). Her vil en CPU-krævende proces kun
"tage" den ene CPU, og den anden CPU er klar til at tage sig af de øvrige opgaver. På et system, som er bedre til at fordele
ressourcerne, vil denne forskel være mindre markant.

-------
Tomas


Krabsen (15-10-2002)
Kommentar
Fra : Krabsen


Dato : 15-10-02 07:35

Jamen det var da en herligt forståelig forklaring

Takker mange gange

mvh
Krabsen



"Tomas Christiansen" <toc-nospam-01@blikroer.dk> skrev i en meddelelse
news:aofe7s$26q6$1@news.cybercity.dk...
> Krabsen skrev:
> > Er der en venlig sjæl, der kan uddybe farerne ved DoEvents lidt?
>
> Naturligvis.
>
> > Jeg naive sjæl har opfattet DoEvents sådan, at den 'frigiver'
> Windows til at
> > gøre evt. andre processer færdige, inden den går videre.
>
> Nej, det er ikke Windows der er problemet (Windows ER et problem, men
> ikke i denne sammenhæng), det er den måde VB serialiserer (afvikler)
> tingene på.
>
>
.....klip...



Tomas Christiansen (14-10-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 14-10-02 22:05

Jan V. skrev:
> Men det var nu opdateringen jeg tænkte på - den kommer ikke uden
DoEvents.

Jo, for katten da!
Ved at bruge .Refresh metoden, som netop er til for det samme.

-------
Tomas


Neo.dk (11-10-2002)
Kommentar
Fra : Neo.dk


Dato : 11-10-02 10:48

Glem det ... der skulle jo bare stå

LabStatus = "Now Copying AutoCAD Drawing" & " " & File1
LabStatus.refresh

Mvh Neo



preben nielsen (11-10-2002)
Kommentar
Fra : preben nielsen


Dato : 11-10-02 16:34


"Neo.dk" <neo___dk@hotmail.removethis.com> skrev i en meddelelse
> Glem det ... der skulle jo bare stå
>
> LabStatus = "Now Copying AutoCAD Drawing" & " " & File1

LabStatus = "Now Copying AutoCAD Drawing " & File1

Lidt kortere....


--
/\ preben nielsen
\/\ prel@post.tele.dk



Neo.dk (11-10-2002)
Kommentar
Fra : Neo.dk


Dato : 11-10-02 21:07

jow dee ....

tak !

Neo



Søg
Reklame
Statistik
Spørgsmål : 177557
Tips : 31968
Nyheder : 719565
Indlæg : 6408881
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste