Newsgroup: it.comp.lang.vo-clipper
Titolo: Thread. Questo sconosciuto.

Sconosciuto almeno per me.
Salve a tutti.
premetto che utilizzo VO 2832a (l'ultima versione del VOPS).
Sono alle prese con la creazione di thread per eseguire delle operazioni 
altrimenti bloccanti per il programma (Attesa di risposte da collegamento 
seriale, senza utilizzare la Serial, ma una libreria fornita da produttore 
dell'apparato).
Bene. Dopo questa premessa, vorrei sapere se qualcuno ha affrontato, e 
risolto, il problema.
Io ho creato i thread che mi servono, li apro e sembra che funzionino ma... 
quanto meno te lo aspetti, spuntano degli errori incomprensibili oppure, 
senza segnalare errore, esce bruscamente dal programma.
Credo che il problema sia nella chiusura dei thread e nella liberazione 
delle risorse.
Dove sbaglio?
Esempio di programma (reale):
METHOD Polling() CLASS WT_Serial_RTF
LOCAL nHandle AS PTR
LOCAL dwThreadID AS DWORD
LOCAL aMat AS ARRAY
LOCAL c1,c2 AS PSZ
c1 := Cast2Psz(AllTrim(SELF:Owner:BoxStart))
c2 := Cast2Psz(AllTrim(SELF:Owner:BoxEnd))
WT_CreateMessage(Cast2Psz("Polling"),c1,c2)  //Invio il messaggio alla 
seriale
aMat := 
{SELF:ConnectionType,"POLLING",c1,c2,SELF:oWinDati,SELF:oWinMessaggi,SELF:cNomeFile,SELF:cNomeFileArrivi,SELF:cNomeFileSpeed}
nHandle := CreateVOThread(NULL_PTR, 0, @WT_Query(), PTR(_CAST, aMat), 0, 
@dwThreadID)
WaitForSingleObject(nHandle,0)
CloseHandle(nHandle)
aMat := {}
RETURN NIL
oWinDati ed oWinMessaggi sono due controlli RICHEDIT dove vado a scrivere 
date e messaggi.
FUNCTION WT_Query(dwWin) AS INT PASCAL
LOCAL aMat AS ARRAY
aMat := ARRAY(_CAST,dwWin)
WT_BoxQuery(aMat)
ApplicationExec(EXECWHILEEVENT)
//GetAppObject():Exec()
ExitVOThread(0)
RETURN 0
FUNCTION WT_BoxQuery(aMat AS ARRAY) AS VOID
LOCAL nCount,xx,nCiclo AS INT
LOCAL cResult AS STRING
LOCAL lTermine,lStop AS LOGIC
LOCAL ConnType,cMessage,cNomeFile,cNomeFileArrivi,cNomeFileSpeed AS STRING
LOCAL cGID,cDID AS PSZ
LOCAL oDati,oMessage AS OBJECT
ConnType     := aMat[1]
cMessage     := aMat[2]
cGID       := aMat[3]
cDID       := aMat[4]
oDati      := aMat[5]
oMessage     := aMat[6]
cNomeFile    := aMat[7]
cNomeFileArrivi := aMat[8]
cNomeFileSpeed := aMat[9]
aMat := {}
//VOEnterCriticalSection(@CS)
lTermine:= FALSE
lStop  := FALSE
nCiclo  := 1
WHILE ! lTermine
 IF Upper(ConnType) == "SERIAL"
  nCount := Val(Psz2String(WT_DataCount()))
 ENDIF
 IF lStop
  lTermine := TRUE
 ENDIF
 IF nCount > 0
  nCiclo := 1
  FOR xx := 1 UPTO nCount
   IF Upper(ConnType) == "SERIAL"
    cResult := Psz2String(WT_DataSave())
   ENDIF
   IF (cResult <> "") .AND. (cResult <> "--------------Empty--------------") 
.AND.;
     (cResult <> "-------Timeout encountered-------") .AND. (cResult <> 
"-------------Correct-------------")
       IF Instr("Request Polling sent to Address",cResult) .OR.;
         Instr("Request Reload sent to Address",cResult) .OR.;
         Instr("Request Delete sent to Address",cResult) .OR.;
         Instr("Request Set Time sent to Address",cResult) .OR.;
      (cResult == "Request Stop sent by User")
        oMessage:TextValue += "1"+cResult+CRLF
        SendMessage(oMessage:Handle(),EM_LINESCROLL, 0, 2)
       ELSE
        oDati:TextValue += StrZero(nWTRXCount++,4,0)+" "+cResult+CRLF
        SendMessage(oDati:Handle(),EM_LINESCROLL, 0, 2)
     IF cMessage == "POLLING"
//////Qui chiamo una funzione che mi elabora dei file dbf.
      Elabora_Testo(cResult,cNomeFile,cNomeFileArrivi,cNomeFileSpeed)
     ENDIF
       ENDIF
   ELSE
    oMessage:TextValue += "2"+cResult + CRLF
    SendMessage(oMessage:Handle(),EM_LINESCROLL, 0, 2)
    WT_CreateMessage(Cast2Psz("Stop"), cGID, cDID)
    lTermine := TRUE
    oMessage:TextValue += IIF(lTermine,"USCITA","CONTINUA") + CRLF
    EXIT  //Esco dal ciclo WHILE
   ENDIF
  NEXT
 ELSE
  nCiclo := 0
 ENDIF
ENDDO
//VOLeaveCriticalSection(@CS)
RETURN
Cosa e principalmente DOVE sbaglio?
Ho provato a creare una struttura al posto dell'ARRAY per passare i 
parametri al thread, allocarla in memoria e poi rilasciarla, ma il 
comportamento è rimasto uguale.
Qualcuno di VOI, che ha esperienza sull'uso dei THREAD, mi può aiutare?
Grazie a tutti anticipatamente.
Enzo.

Ciao
per quello che ne so io, non utilizzarli. Ho sempre visto sul forum che 
danno dei problemi. Sono sicuramente limitati dal numero che ne puoi 
usare e dal tipo di variabili che puoi utilizzare. Francamente farei 
partire una nuova applicazione e farei comunicare i due programmi (c'è 
un esempio, ma non ricordo quale)
Ciao
Alessandro
Enzo Campanella ha scritto:



concordo pienamente
io farei una seconda applicazione
Massimo

 ha scritto nel messaggio 
news:49d5ac3d$0$834$4faf...@reader5.news.tin.it...


 Ciao
Bene.
Ho seguito il tuo suggerimento.
Ho riprogrammato tutto in Vulcan e rifatto le stampe con StimulSoft.
Funziona bene ma.... la classe Serial.
In allegato le classi che ho creato e cio� la classe Serial Inherit 
SerialPort e la classe Serial_TB Inherit TextBox
Nelle varie ricerche che ho fatto, dicono che per accedere ad un aggetto da 
thread si deve dichiarare l'oggetto Delegate e chiamarlo con Invoke non ho 
capito come fare.
 Mi puoi aiutare?
Grazie.
Enzo.