Newsgroup: it.comp.lang.visual-basic
Titolo: Componente Out Of Process duro a morire...

chiamante; la procedura di elaborazione la metti sull'evento Timer
Alla fine ho realizzato un exe che fa un ciclo, che riempie un database in
maniera asincrona.
tale ciclo parte con un click e finisce con un click, MA NON MUORE.
Come mai?
Faccio uno schema della mia situazione
app-client
-progetto/riferimenti/Ciclo
-generale dichiarazioni:
    Public WithEvents DATI As Ciclo
-Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
    Select Case Toolbar1.Buttons.Item(1).Value
        Case Is = tbrPressed
            Set DATI = New Ciclo
            DATI.Connetti (True) 'innesco il timer che dopo pochissimo
attiva il ciclo vero e proprio
        Case Is = tbrUnpressed
            DATI.StoppaCiclo 'meccanismo per fermare tale ciclo
    End Select
 End Sub
-Private Sub DATI_InviaFine(Fine As Boolean) 'una volta terminato il ciclo
viene inviato l'avviso di fine ciclo e chiusura del database
    Set DATI = Nothing
 End Sub
comp-server-out of process composto da una classe, 2 moduli ed un form
-progetto/riferimenti/ADO...
-generale dichiarazioni:
    Public Event InviaFine(Fatto As Boolean)
-Private Sub Class_Terminate()
    set ConnessioneDB = Nothing
    set p_Class = Nothing 'oggetto creato dalla procedura temporizzata
Ebbene. Tutto funziona alla meraviglia ma l'activex non viene rilasciato
alla fine. cosě rimane vivo ma immobile nella memoria.
Rileggendo quelle premesse regole, ho creduto che l'unica cosa che
ostruisse, fosse la non chiusura del form, ma una volta aggiunto in ultimo
anche Unload Form, mi arrivava un messaggio di errore cosiccome quando
impostavo il famigerato comando End.
L'errore si riferisce all'activex ed č di quelli c.d. irreversibili per i
quali l'applicazione viene terminata.
Dove l'errore?
C'č qualcosa di "comune" che dimentico?
Ricapitolo le condizioni auree per la chiusura dell'activex in/out of
process
-Riferimenti  Non esiste alcun riferimento interno o esterno agli oggetti
pubblici del componente. Non esistono riferimenti agli oggetti pubblici del
componente in alcun client out-of-process.
...e cioč?
-Form Il componente non include alcun form visibile. Il componente non
include alcun form caricato (out-of-process).
... eh ma non riesco a chiuderlo senza provocare errori... :(
-Codice Non č in esecuzione alcun codice dei moduli del componente e non č
in attesa di esecuzione alcun codice dell'elenco delle chiamate. Come per il
componente in-process.
...credo che cosě sia visto che arriva alla fine del codice dell'evento
Terminate. O sbaglio? (Credo di sě, ma mi serve qualche chiarimento)
-Avvio Il componente non sta per essere avviato in risposta alla richiesta
di un oggetto da parte di un client.
...Tipo il famoso click di cui parlavo all'inizio?
Scusate questo mega post ma sono letterlmente INSTECCATO :(
Ciao,
Brio




  Ma il testo dell'errore?
  P_Class che ruolo ha nel tuo componente?
  Assicurati che non ci siano "riferimenti circolari" fra il tuo componente e
qualcos'altro.
Cmq dopo un unload di una form metti sempre Set <nomeform> = Nothing
Ciao
 
--------------------------------
Inviato via 
http://usenet.libero.it

chiamante; la procedura di elaborazione la metti sull'evento Timer
Allora:
Sicuro, che hai disattivato il timer?
Ma, soprattutto:
abbi una proprietą booleana tipo blnStop nel tuo componente.
Quando il client vuole che il componente si chiuda, setta quella
proprietą a true
Nel timer, in fondo, per blnStop = true, stoppa il timer ed  esegui
l'unload della form.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Allora salvo, passaggi matematici e piccoli segreti, vi invio il codice
incriminati
app-client
-progetto/riferimenti/Ciclo
-generale dichiarazioni:
    Public WithEvents DATI As Ciclo
-Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
    Select Case Toolbar1.Buttons.Item(1).Value
        Case Is = tbrPressed
            Set DATI = New Ciclo
            DATI.Connetti (True) 'innesco il timer che dopo pochissimo
attiva il ciclo vero e proprio
        Case Is = tbrUnpressed
            DATI.StoppaCiclo 'meccanismo per fermare tale ciclo
    End Select
 End Sub
-Private Sub DATI_InviaFine(Fine As Boolean) 'una volta terminato il ciclo
viene inviato l'avviso di fine ciclo e chiusura del database
    Set DATI = Nothing
 End Sub
-Private Sub DATI_InviaFatto(Fine As Boolean)
    ...
 End Sub
____________________________________________________________________________
___________
MODULO DI CLASSE
Option Base 1
Option Explicit
Public Event InviaFatto(Fatto As Boolean)
Public Event InviaFine(Fatto As Boolean)
Dim Variabile(400) As String
Dim ID(400) As Integer
Dim Fatto As Boolean
Private WithEvents connConnection As ADODB.Connection
Private WithEvents rsRecordSet As ADODB.Recordset
Private m_Timer As Long
Private m_Id As Long
Private m_OK As Boolean
Public Function Connetti(OK As Boolean) As Long
   m_OK = OK
   'Qui imposti un timer di 500ms che eseguirą la funzione TimerProc nel
modulo bas descritto sotto
   m_Timer = SetTimer(0, 0, 500, AddressOf TimerProc)
   m_Id = GetTickCount()
   Set p_Class = Me
   Connetti = m_Id
End Function
Public Sub StoppaCiclo()
    m_OK = False
End Sub
Private Sub Class_Terminate()
   Set p_Class = Nothing
   If m_Timer Then
      KillTimer 0, m_Timer
      m_Timer = 0
   End If
   'UNLOAD FORM1!!!!!!!!!!!!!!!!!!!
End Sub
Friend Sub CompiCiclo()
    KillTimer 0, m_Timer
    Fatto = False
    Set connConnection = New ADODB.Connection
    connConnection.CursorLocation = adUseServer
    connConnection.Open "Provider=Microsoft.Jet.OLEDB.3.51;Data
Source=D:\......mdb"
    Set rsRecordSet = New ADODB.Recordset
    rsRecordSet.CursorType = adOpenForwardOnly
    rsRecordSet.CursorLocation = adUseClient
    rsRecordSet.LockType = adLockPessimistic
    rsRecordSet.Source = "SELECT * FROM ..."
    rsRecordSet.ActiveConnection = connConnection
    rsRecordSet.Open
    Do
 ....
        RaiseEvent InviaFatto(True)
    Loop Until m_OK = False
        rsRecordSet.Close
        Set rsRecordSet = Nothing
        connConnection.Close
        Set connConnection = Nothing
        RaiseEvent InviaFine(True)
End Sub
____________________________________________________________________________
______
MODULO1
Option Explicit
Public Declare Function GetTickCount Lib "kernel32" () As Long
Public Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal
nIDEvent As Long) As Long
Public Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal
nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public p_Class As Ciclo
'Questa č la callback del timer.
Public Sub TimerProc(hWnd As Long, uMsg As Long, idEvent As Long, dwTime As
Long)
   p_Class.CompiCiclo
End Sub
____________________________________________________________________________
_______
MODULO2 contiene solo operazioni matematiche
____________________________________________________________________________
_______
FORM1 non ha comandi ma contiene controlli Text per una connessione DDE che
perņ non č automatica e che ho anche settato ".linkmode=none"