Avatar billede sjh Nybegynder
21. september 2000 - 01:13 Der er 27 kommentarer og
2 løsninger

For I = 0 to xxxxx

Er der en som kender et script som virker beder en det jeg har i forvejen

det skal kunne pause (For I = 0 to xxxxx) når man flytter vinduet, men det må helst ikke sinke hastiheden på (For I = 0 to xxxxx).

Hvis man kan flytter vinduet mens (For I = 0 to xxxxx) køre så er det så vil jeg blive MEGET GLAD

Script:

Dim I

Public Function PauseI()
\'Pause I når vinduet flyttes
Dim Pause
    Do While Pause <> 1
    Pause = Pause + 1
    DoEvents
Loop
End Function

Private Sub Command1_Click()
\'Start I
For I = 0 To 10000
    PauseI
    Form1.Caption = I
Next I
End Sub

Private Sub Command2_Click()
\'Stop I
    I = 10000
End Sub

Avatar billede yonzie Nybegynder
21. september 2000 - 08:05 #1
Nu kender jeg ikke lige VBasic, men jeg har da en smule programmeringserfaring i C++...
Noget i denne her retning vil virke (det bliver i C, men du fatter nok meningen):

If(tjek vindues flyt)
{
    for(I = 0; I < 10000; I++) //Der er her den loop\'er
    {
          cursorposition = Hvor musen er på skærmen
          If(cursorposition != oldcursorposition)
          {
                flyt vindue
          }
          oldcursorposition = cursorposition
    }
}
Selvfølgelig skal det gøres så den tjekker både musens x&y... det kan også være du ikke behøves det i VB, det ved jeg ikke... Ideen er simpelthen at hver gang den har talt et tal tjekker den om der skal laves noget, istedet for:

funktion
PAUSE
funktion

Håber det hjælper...
Avatar billede nolle_k Nybegynder
21. september 2000 - 09:47 #2
Hvis du nøjes med kalde DoEvents hver 100. gang skulle det forbedre scriptet en del!

Prøv det!

Det vil sige

if(Not(I Mod 100)) then
  PauseI
end if
Avatar billede nolle_k Nybegynder
21. september 2000 - 09:49 #3
Så kan du samtidigt flytte vinduet!

Grunde til at det script du har lavet er lidt langsomt er på grund af alle de kald til DoEvents!

Denne funktion frigiver ALT hvad VB programmet har allokeret og i den dur hvilket alligevel tager lidt tid. Og hvis dett så gøre rigtig mange gange kan det sænke hastigheden meget!
Avatar billede winkill Nybegynder
21. september 2000 - 12:31 #4
Det her virker i VB 6.0.
Husk at tallet i Call Pause() er millisekunder, du skal eks skrive 5000 for at skabe en pause på 5 sekunder.

Private Declare Function GetTickCount Lib \"kernel32\" () As Long

Private Sub Command1_Click()
    Call Pause(5000)
End Sub

Private Sub Pause(lngMilliseconds As Long)
    Dim lngTmr As Long
    lngTmr = GetTickCount
    Caption = \"Pause\"
    While lngTmr + lngMilliseconds > GetTickCount
        DoEvents
    Wend
    Caption = \"Run\"
End Sub
Avatar billede nolle_k Nybegynder
21. september 2000 - 12:39 #5
Jeg holder stadigvæk på at DoEvents skal kaldes så få gange som muligt -> Altså kun kaldes hvis det er højest nødvendigt!
Avatar billede winkill Nybegynder
21. september 2000 - 12:43 #6
Hvorfor dog det nolle ?

DoEvents gør det muligt at flytte vinduet mens timeren kører. Jo flere gange i løbet at x millisekunder man kalder DoEvents, jo oftere bliver flytningen af vindue, mus, keyboard og alle de programmer der måtte kører i windows opdateret.

Prøv dog den kode jeg har skrevet, det kører som smurt.
Avatar billede nolle_k Nybegynder
21. september 2000 - 12:47 #7
Det kan godt være, at i det tilfælde der kører som smurt men jeg har andre erfaringer, der viser at alt for mange DoEvents kald sløver det hele!
Avatar billede winkill Nybegynder
21. september 2000 - 12:50 #8
VB koden kører langsommere når den hele tiden skal checke for user-inputs, og holde styr på \"baggrunds-programmer\" og services. Men her er det jo netop meningen at afviklingen af koden skal køre langsomt. Helst så langsomt at det virker som om det er gået i stå.

Men ok, afprøv din teori, brug denne i stedet.

Private Sub Pause(lngMilliseconds As Long)
    Dim lngTmr As Long
    lngTmr = GetTickCount
    Caption = \"Pause\"
    While lngTmr + lngMilliseconds > GetTickCount
        \'
    Wend
    Caption = \"Run\"
End Sub

Her bliver DoEvents slet ikke brugt, det betyder så også at windows \"fryser\" mens der er pause i programmet.
Avatar billede nolle_k Nybegynder
21. september 2000 - 12:52 #9
Øøøøøøøøøøhh!

Nu har jeg lige prøvet dit fine eksempel WinKill!!


Har du prøvet at skrive TickCount ud i det do while loop, der er lavet???


Loopet udføres ikke når vinduet flyttes rundt!!!
Jeg ved ikkke om det var hensigten! Men det kommer jo lidt an på hvad det hele skal bruges til!
Avatar billede nolle_k Nybegynder
21. september 2000 - 12:54 #10
Jeg er godt klar over, hvad der sker hvis ikke DoEvents benyttes!

Jeg tror det er lidt forvirring om hvad formålet med spørgsmålet er???

Avatar billede winkill Nybegynder
21. september 2000 - 12:57 #11
Det er jo en helt anden sag. Jeg plejer at have en unload sekvens hvor jeg unloader alle objekter og komponenter som er indlæst. Denne sekvens kunne i dette tilfælde være på en enkelt linie og ligge i Form_Unload

Private Sub Form_Unload(Cancel As Integer)
    End
End Sub

Men det har ikke noget med pause funktionen at gøre - det kan jo også lavets på snart en mill. måder, det afhænger helt af hvad programmet er designet til.
Avatar billede winkill Nybegynder
21. september 2000 - 12:59 #12
Sjh -> Hvad er det du søger at opnå med koden ?
Avatar billede nolle_k Nybegynder
21. september 2000 - 13:00 #13
Jeg forstår ikke hvor du vil hen med Form_Unload event handleren???

Var det et svar på et af mine spørgsmål??
Avatar billede nolle_k Nybegynder
21. september 2000 - 13:01 #14
Han er blevet kvalt af do while loopet! *GGGG*
Avatar billede winkill Nybegynder
21. september 2000 - 13:12 #15
Nej, jeg troede du brokkede dig over noget andet.

Uanset hvisken pause du laver så opdaterer programmet ikke mens du resizer eller flytter vinduet.

Sådan er det med vindows og mig bekendt kan du kun komme uden om med noget hardcore C++ programmering. Men du skal da være velkommen til at se om du kan skrive en stump kode der gør det bedre.

Det var en udfordring!!!
Avatar billede nolle_k Nybegynder
21. september 2000 - 15:45 #16
Eller også skal du bare lave et COM objekt, der håndtere pausen og herefter smider et event når denne pause er gået!
Dette kan så laves via en timer i VB og vil gøre at du slipper for at spekulere over DoEvents og ting som denne! Jeg ved ikke om det er lettere! Umiddelbart ville jeg mene at det ikke er!
Avatar billede sjh Nybegynder
21. september 2000 - 19:17 #17
winkill: jeg er ved at lave et program der kan krypter tekst, men når jeg krypter/afkrypter låser vinduet og man kunne tro at programmet er gået ned.
Avatar billede nolle_k Nybegynder
22. september 2000 - 09:48 #18
Så burde DoEvents løse dit problem!
Avatar billede nolle_k Nybegynder
22. september 2000 - 09:52 #19
Men hvis du lavet et COM objekt, der sørger for krypteringen garanterer jeg dig, at du slipper for alle dine problemer!!!

Events kan åbenbart godt fanges mens man flytter et vindue
Avatar billede nolle_k Nybegynder
22. september 2000 - 10:03 #20
Lav et COM object, der indeholder en metode, et event, en privat member og en timer!

Public Event TextIncrypted(Text As String)

Public Sub IncryptText(Str As String)
  m_PrivateMember = Str
  \'Make the Incryption Asyncronious
  Timer1.Interval = 1
  Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
  Timer1.Enabled = False
  IncryptTheText (m_PrivatMember)
  RaiseEvent TextIncrypted(m_PrivateMember)
End Sub

Der hvor du bruger dette objekt gør du følgende

Private WithEvents Obj As IncryptObj

Private Sub Initialize()
  Set Obj = New IncryptObj
End Sub

Private Sub IncryptText(Str As String)
  IncryptObj.IncryptText Str
End Sub

Private Sub IncryptObj_TextIncryptet(Text As String)
  \'Incryption is done
End Sub

Private Sub Terminate()
  Set Obj = Nothing
End Sub

Avatar billede sjh Nybegynder
22. september 2000 - 22:57 #21
nolle_k: hvad mener du når du skriver \"COM object\", er det ActivX Control du mener eller hvad.


Avatar billede nolle_k Nybegynder
23. september 2000 - 12:02 #22
JEPPER!!!!!
Avatar billede mikker Nybegynder
23. september 2000 - 12:34 #23
Hvorfor skulle man være interesseret i at flytte vinduet?

Kan man ikke bare lave en grafisk visning af hvor langt man er nået med krypteringen?

Så længe man løbende bliver informeret om hvor langt man er nået skulle der vel ikke være fare for at man panikker?

Jeg ved godt jeg har det med at slynge bemærkninger ud :-)

- Mikker
Avatar billede winkill Nybegynder
23. september 2000 - 13:07 #24
Hmmm... Jeg kender ikke meget til kryptering, jeg bruger kun base64 encoding, og det er jo ikke ligefrem kryptering. Men hvis jeg skulle krypterer noget som helst ville jeg smide alle funktioner der har med kryptering at gøre i en lille DLL (som selvfølgeligt skal understøtte Component Object Modal så den også kan bruges af VBScript og ASP).

Den måde jeg håndterer ventetid og pauser minder meget om det nolle har postet, men ikke helt. Jeg bruger callback eller notify, men det vil jeg ikke prøve på at forklarer her, da jeg er ret ny i den del af Windows API.
Avatar billede winkill Nybegynder
23. september 2000 - 13:08 #25
Mikker -> Det ville jeg også mene var den letteste og mest brugervenlige metode.
Avatar billede nolle_k Nybegynder
24. september 2000 - 18:17 #26
Jeg vil mene, at det altid er at foretrække at brugeren har mulighed for at afbryde en vilkårelig operation. Uanset hvor meget visuel information der gives til brugeren vil der altid være en, der vil lave noget andet mens en operation foregår!!
Avatar billede winkill Nybegynder
25. september 2000 - 02:52 #27
Jeg ved ikke hvad denne diskution er ved at udvikle sig til, men det finder _I_ jo nok ud af.
Avatar billede nolle_k Nybegynder
25. september 2000 - 22:40 #28
Heller ikke her! Men det må vel også være point uddelings tid eller hvad siger I???
Avatar billede sjh Nybegynder
26. september 2000 - 00:03 #29
ja ja i skal nok få 60 point.

og tak for hjælpen

Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

Seneste spørgsmål Seneste aktivitet
I går 21:00 Libre Office Impress Af Frank i Andre styresystemer
I går 11:47 VB script Af Jenshentze i Word
I går 11:21 Popup ved opstart Af mort1 i Windows
04/0918:50 Slet lokal konto Af ErikHg i Windows
04/0916:05 Ændre tal i en celle Af xvid i Excel