Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [VB NET] Doevents

  1. #1

    [VB NET] Doevents

    ho un progetto "Applicazione windows" con una classe. nella classe devo eseguire il comando Application.DoEvents. Se voglio mettere la classe in una dll , giustamente il comando viene segnato errato per mancanza di una form... come faccio per far eseguire il doevents sull'applicazione, invocandolo nella classe della dll?

  2. #2
    Nelle classi in C# io faccio cosi'

    codice:
    using System.windows.Forms; 
    Application.DoEvents();
    oppure anche il progetto

    codice:
    MyProgram.DoEvents();

  3. #3
    le funzioni che mi hai postato vanno bene se inserite nella classe del progetto "eseguibile"... ma in una classe di dll non posso usare form!

  4. #4
    MMmmm fammici pensare un attimo ...

    Ma se non usi un form a cosa ti serve DoEvents ?
    Normalmente viene uato per non 'bloccare' il rePaint di una form o di un controllo.


  5. #5
    ti spego... praticamente ho una classe che mi gestisce il protocollo ftp... ti prendo in esame una funzione che aspetta la risposta dal server...

    Private Function WaitForResponse(Optional ByVal TimeOut As Integer = 60000) As classLastResponse
    Try
    Dim StartTime As Long = Environment.TickCount
    While (bNewResponse = False) And (Not (Environment.TickCount - StartTime) = TimeOut)
    Application.DoEvents()
    End While
    Application.DoEvents()
    If (bNewResponse = False) Then
    ResetResponse()
    Return New classLastResponse(0, "")
    Else
    ResetResponse()
    Return LastResponse
    End If
    Catch ex As Exception
    Console.WriteLine(ex.ToString)
    End Try
    End Function

    come vedi ci sono 2 chiamate a doevents...
    che servono per far si che l'applicazione non si blocchi nel tempo di attesa...
    naturalmente questa sub inserita nella classe dell'applicazione esegubile cioè in un form, funziona, perche trova il metodo doevents.
    in una dll formata da classi che non usano form non viene trovata per la mancanza del form...
    la mia domanda è : c'è un modo per far si che doevents sia eseguito dalla dll sull'applicazione? o un metodo alternativo a dovents? ...i thread?...

  6. #6
    mmm beh il metodo deprecato è lo sleep se non sbaglio

    Comunque puoi usare una chiamata alle API, alternativa all' uso di DoEvents

    codice:
    'DoEvents alternative function.
    
    Private Type POINTAPI
            x As Long
            y As Long
    End Type
    
    Private Type MSG
        hwnd As Long
        message As Long
        wParam As Long
        lParam As Long
        time As Long
        pt As POINTAPI
    End Type
    
    Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" _
    (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, _
    ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
    Private Declare Function TranslateMessage Lib "user32" _
    (lpMsg As MSG) As Long
    Private Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" _
    (lpMsg As MSG) As Long
    
    Private Const PM_REMOVE = &H1
    
    'The alternative function for DoEvents:
    Private Sub MyDoEvents()
        Dim CurrMsg         As MSG
        
        'The following loop extract all messages from the queue and dispatch them
        'to the appropriate window.
        Do While PeekMessage(CurrMsg, 0, 0, 0, PM_REMOVE) <> 0
            TranslateMessage CurrMsg
            DispatchMessage CurrMsg
        Loop
    End Sub
    
    Private Sub cmdStart_Click()
        Dim lCounter            As Long
        
        For lCounter = 1 To 20000
            lblCounter.Caption = CStr(lCounter)
            MyDoEvents
        Next
    End Sub
    Il file è commentato in Inglese, e non è opera mia.
    Pero' l' avevo già usato una volta per uno Control se non sbaglio.

    Prova


  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,461
    In questo caso specifico, si dovrebbe usare i thread al posto di un banale Application.DoEvents, che se non governato attentamente prendendo tutte le dovute preoccupazioni potrebbe anche portare ad errori di vario tipo (ad esempio, la chiusura del form principale prima che il processo di elaborazione termini).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.