Newsgroup: it.comp.lang.visual-basic
Titolo: dll con form modale

Salve a tutti.
Una dll activex espone un metodo che visualizza un form modale.
Con un bottone nel form della applicazione invoco tale metodo e la dll
apre il form. Tutto Ok.
Nel form della applicazione c'è un timer.
Quando l'applicazione gira in IDE e visualizzo il form modale della dll,
il timer si ferma.
Quando faccio la stessa cosa con l'applicazione compilata il timer
continua a funzionare.
E' spiegabile quanto accade?
C'è da fidarsi o in compilato potrebbero esserci problemi che aspettano
solo il momento meno opportuno per manifestarsi?
Grazie.
Ciao.
pinco_pallo 
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 aspettano solo il momento meno opportuno per manifestarsi?
E' noto che le finestre modali (o anche un normale MsgBox) blocca i Timer
nell'IDE, ma non nell'EXE compilato.
Quindi, per quanto riguarda l'EXE, fidati.

 Quindi, per quanto riguarda l'EXE, fidati.
Per le MsgBox ok, lo sapevo.
Ma l'apertura di un form modale non blocca il timer, nemmeno nell'IDE.
Sei sicuro che posso fidarmi?


 Sei sicuro che posso fidarmi?
Diciamo che, in termini puramente filosofici, io non sono mai sicuro, nè mi
fido, di niente, però, nella realtà, "scommetto" (e verifico) e mi fido in
continuazione.
Vuoi una garanzia da me che domani sorge il sole? Non te la posso dare, però
ci credo. ;-)

 ci credo. ;-)
Già. Ancora una volta con M$ si può solo scommettere, contando sul
favore del Caso. Fidarsi di M$ è da audaci, o da disperati. Non so tu,
ma io sono più della seconda!!
Grazie.


E' spiegabile quanto accade?
I messaggi del timer non vengono mai accodati piu' di uno alla volta.
Inoltre hanno una bassa priorita' di elaborazione.
Nell'IDE, tra il tuo debug step-by-step e visual basic che elabora i
messaggi al posto tuo (considera che dall' IDE non debuggi il "tuo"
processo) e' molto probabile che rimanga indietro il timer.
-- 
ciao, hal

ma io sono più della seconda!!
Non vale solo per Microsoft, fidati :-PPP
-- 
ciao, hal

 processo) e' molto probabile che rimanga indietro il timer.
Se restasse solo indietro sarebbe plausibile.
Sospetto che vengano segati tutti i messaggi, e non solo quelli del
timer. Dovrei indagare.
Grazie.
Ciao


 Non vale solo per Microsoft, fidati :-PPP
Ho ristretto per non sembrare troppo filosofo, ma penso che valga per
tutte le scelte :-PPP


timer. Dovrei indagare.
C'e' qualcosa allora che potresti anche verificare. 
Ho appena provato adesso, dall' ide, con un form Form1 ed un Timer
impostato a 100.
Ho poi inserito un nuovo form Form2 che non fa assolutamente nulla.
Questo e' il codice di Form1:
Option Explicit
Private Sub Form_DblClick()
    Form2.Show vbModal
End Sub
Private Sub Timer1_Timer()
    Debug.Print Now, Timer
End Sub
Ho lanciato nell'ide, ed ho visto l' immediate window che aggiungeva
rapidamente righe.
Ho fatto doppio clic sul form, aprendo cosi' il Form2 modale.
Ti garantisco che il timer ha continuato ad andare.
Mi viene un sospetto: stai usando il timer per simulare un
comportamento multithreading?
-- 
ciao, hal

Ho poi inserito un nuovo form Form2 che non fa assolutamente nulla.
Rileggendo il tuo post iniziale ho visto che il form modale e'
contenuto in una dll activex.
Ho cosi' creato un gruppo di progetti, con un nuovo progetto activeX
dll che ha una classe Class1 ed un Form Form1.
// Codice di Class1
Option Explicit
Public Sub Run()
    Form1.Show vbModal
End Sub
// Progetto Exe modificato:
Option Explicit
Private Sub Form_DblClick()
    'Form2.Show vbModal
    Dim c As Class1
    Set c = New Class1
    c.Run
End Sub
Private Sub Timer1_Timer()
    Debug.Print Now, Timer
End Sub
Anche cosi', il timer va.
Resto dell'idea che il problema non sia proprio tutto di vb.
-- 
ciao, hal

 comportamento multithreading?
Attento. Il form modale è in una dll activex.
Un metodo della dll carica e visualizza in modale un form che fà parte
della dll. Il timer invece è nella applicazione principale.
 
Aprendo un form modale come hai fatto tu và bene anche a me (ci
mancherebbe altro!).
Ciao.


della dll. Il timer invece è nella applicazione principale.
Oh, sono riuscitro a riprodurlo :-)
App principale dall' ide che chiama la dll compilata: cosi'
effettivamente il timer si ferma.
Ho notato che il form non riceve nessun messaggio WM_TIMER, ma il
codice del timer viene eseguito in seguito ad una serie di chiamate
provenienti da msvbvm.dll.
Purtroppo qui non ho i simboli di debug del runtime e non saprei dire
altro. Quindi avevi ragione tu: il problema e' nell'esecuzione
all'interno dell'IDE.
Soluzione: usare l'API, estromettendo, cosi', l'intervento di Visual
Basic.
Il codice di Form1 diventa:
Option Explicit
Private m_TimerID As Long
Private Declare Function SetTimer Lib "user32" _
            (ByVal hwnd As Long, _
            ByVal nIDEvent As Long, _
            ByVal uElapse As Long, _
            ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" _
            (ByVal hwnd As Long, _
            ByVal nIDEvent As Long) As Long
 
Private Sub Form_DblClick()
    Dim c As Class1
    Set c = New Class1
    c.Run
End Sub
Private Sub Form_Load()
    m_TimerID = SetTimer(0, 0, 100, AddressOf TimerProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
    If (m_TimerID) Then
        Call KillTimer(0, m_TimerID)
        m_TimerID = 0
    End If
End Sub
Aggiungiamo pi un modulo .bas per la funzione di callback:
Option Explicit
Public Sub TimerProc(ByVal hwnd As Long, _
                     ByVal uMsg As Long, _
                     ByVal idEvent As Long, _
                     ByVal dwTime As Long)
    Dim s As String
    s = Now & "  -  " & Timer
    Form1.Caption = s
End Sub
La dll rimane la stessa.
Adesso va :-)
-- 
ciao, hal

 Anche cosi', il timer va.
In effetti io sto usando la dll compilata e l'exe in IDE.
Nella Q177996 si parla di eventi che si perdono usando IDE per l'exe e
compilato per l'activex, e che invece vanno bene sia usando ambedue
compilati che ambedue in IDE.
Ti confesso che non ho mai provato a lavorare con un gruppo di progetti
e non saprei come fare per avere ambedue i progetti nell'IDE. Inoltre il
motivo per cui porto in dll sezioni del progetto è perchè l'IDE arranca.
Grazie.
Ciao.


 Adesso va :-)
Ok. Grazie davvero.
