Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [VB2010] Quando si "compie" una azione?

    La domanda è assolutamente di studio....

    Mi rendo conto che il titolo non è molto indicativo, ma mi spiego meglio con un esempio.

    Con un Timer controllo se appare una certa finestrella sullo schermo e la chiudo automaticamente:

    codice:
    'prima tutta una serie di controlli per vedere se la finestrella è
    'visibile e per leggerne la posizione... poi il  codice  per chiuderla
    'dove WinX e WinY sono coordinate interne al pulsante di chiusura.
    
    Debug.Print("Clicco per chiudere la finestrella")
    Cursor.Position = New Point(WinX, WinY)
    
    NativeMethods.Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, IntPtr.Zero)
    NativeMethods.Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, IntPtr.Zero)
    la finestrella si chiude immediatamente... MA ORA LA DOMANDA "TECNICA"

    Ho aggiunto per controllo uno sleep al codice (in realtà sono diversi sleep e altro codice di controllo, ma "semplifico" perché la domanda non cambia:

    codice:
    Debug.Print("Clicco per chiudere Buy In")
    Cursor.Position = New Point(WinX, WinY)
    
    NativeMethods.Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, IntPtr.Zero)
    NativeMethods.Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, IntPtr.Zero)
    
    Sleep (5000)
    ebbene... anche se la scritta ("Clicco per chiudere la finestrella") appare immediatamente.... la finestrella si chiude poi dopo 5 secondi!! Anche se lo "Sleep" è SEGUENTE al codice che preme il pulsante.

    Come mai? In VB le istruzioni vengono "immagazzinate" da qualche parte ed ESEGUITE solo quando il codice raggiunge la fine della routine??

    E se la risposta è si... chè un qualche "controcodice" che le faccia agire subito?


  2. #2
    La finestra fa parte della tua applicazione?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Originariamente inviato da MItaly
    La finestra fa parte della tua applicazione?
    No... è la finestra di una applicazione esterna... per quello devo chiuderla con una API.

    Ma la domanda di fondo credo non abbia molto a che fare con la cosa... la domanda di fondo è perché la API per funzionare ha bisogno che lo Sleep sia superato... non me ne capacito...

  4. #4
    Originariamente inviato da eziogsv
    No... è la finestra di una applicazione esterna... per quello devo chiuderla con una API.

    Ma la domanda di fondo credo non abbia molto a che fare con la cosa...
    Invece ha a che fare eccome... se la finestra era della tua applicazione era ovvio che si bloccasse tutto, una sleep sul thread che gestisce la GUI intoppa la message pump, per cui tutte le finestre della tua applicazione si inchiodano (non ricevono window messages finché la message pump non riprende ad andare).

    Se però la finestra è di un'altra applicazione non ci dovrebbe essere problemi - ogni applicazione ha una message pump separata, per cui il fatto che sia bloccato il thread della GUI in un altro programma non dovrebbe influire. Il dubbio che mi viene, però, è che l'altra applicazione, al momento di chiudere la finestra, vada a fare qualcosa di strambo (tipo recuperare i titoli di tutte le finestre visibili) che richiede che le altre applicazioni ricevano regolarmente i messaggi, e si inchioda quindi quando invia il messaggio alla tua finestra. Per verificare questa cosa, prova a fare così: lascia solo la sleep (magari mettila un po' più lunga, tipo 20 secondi) ed esegui il tuo programma; quando questo si ferma sulla sleep, prova a chiudere a mano la finestra dell'altro programma e vedi se si chiude immediatamente o rimane incantato.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.