VB6 polling vs evento timer [chiuso]

Sep 11 2020

I processi esterni della mia app eseguono il polling di un valore booleano per vedere se c'è del lavoro da fare. Ora desidero controllare quella variabile in un Timerevento per ridurre i messaggi di "non risposta".

Un oggetto Timer deve essere posizionato su un form, il che sembra causare alcune limitazioni.

L'avvio dell'evento da un modulo con Me.Show( vbModal) funziona alla grande. Solo che non voglio mostrare effettivamente quel modulo, voglio solo usare il timer. Il tentativo di nascondere il modulo utilizzando Me.Hidequindi perde il comportamento Modale di cui ho bisogno, quindi non è una buona soluzione.

Ho provato ad avviare l'evento da una classe ma mostra lo stesso comportamento indesiderato di Me.Hide: L'elaborazione ritorna al chiamante invece di rimanere nel sottotitolo dell'evento timer in attesa di lavoro.

Esiste un modo per implementare un evento in base al Timerquale non è necessario mostrare un form e non ritorna immediatamente al chiamante? I processi esterni non hanno IO sullo schermo e nessuno è desiderato.

Risposte

1 ÉtienneLaneville Sep 11 2020 at 04:45

Puoi esaminare l'utilizzo della funzione SetTimer dall'API di Windows. Aggiungere il codice seguente in un modulo e un utente TimerStartcon un intervallo in millisecondi:

Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long

Public Function TimerStart(ByVal p_lngInterval As Long) As Long
    
    ' Start timer
    TimerStart = SetTimer(0, 0, p_lngInterval, AddressOf TimerCallBack)

End Function

Public Sub TimerCallBack(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
    
    ' Handle your polling here

End Sub

Non hai bisogno di un modulo, quindi dovrebbe soddisfare le tue esigenze.

Puoi anche usare Sleep dall'API di Windows insieme a Timer per mantenere in esecuzione il tuo EXE:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Sub Main()

    TimerStart 2000
    
    Do While True
        DoEvents
        Sleep 1000
    Loop
    
End Sub

Vedi queste altre risposte per maggiori dettagli:

  • Come creare timer API sicuri in VBA?
  • Come posso ritardare l'esecuzione del codice in Visual Basic (VB6)?