Newsgroup: it.comp.lang.visual-basic
Titolo: [?] [VB6] Multithreading

Qualcuno sa dirmi come è possibile affrontare il problema del multithreading
in VB6?
Qualsiasi consiglio è ben accetto: dll, activex-exe, tips&triks...
Grazie, ciao


  Be ma tu che devi fà?
Ciao
--------------------------------
Inviato via 
http://usenet.libero.it

 ha scritto nel messaggio
news:194Z185Z250Z2Y1...@usenet.libero.it...


 Active-exe.
Era quello che pensavo anch'io.
Solo che non riesco a verificare che funzioni realmente in un progetto di
test.
Mettiamo che io abbia il mio P (progetto exe normale) che usa X (progetto
activeX-exe, trhead per classe, con classe C Multiuse).
C lancia un loop, quindi ogni instanza di C lancia il suo loop.
Se tutto quadra, mi aspetterei che quando da P instanzio C1 e C2, questi
procedano con i loro loop in modo asincrono, invecie  il loop della prima
classe blocca tutto.
Cosa mi sfugge?
Ciao, grazie

 ha scritto nel messaggio
news:b9b0bf$hde59$1...@ID-184808.news.dfncis.de...


 l'ActiveX-Exe?
  In effetti l'esecuzione di un metodo è sincrona se questo fa un loop
l'applicazione chiamante rimane ferma a meno che non instauri un sistema di
comunicazione asincrona fra il programma principale e l'oggetto in question,
che so, basato su messaggi ad esempio.
Mi sfugge qualcosa anche a me?


 l'ActiveX-Exe?
Entrambi i modi.
Il progetto principale si inchioda.
Mi starebbe bene anche se l'activex-exe si instanziasse in processi
separati...
Ciao


  Suggerimento :
Private Const CREATE_SUSPENDED As Long = &H4
Private Const THREAD_BASE_PRIORITY_IDLE As Long = -15
Private Const THREAD_BASE_PRIORITY_LOWRT As Long = 15
Private Const THREAD_BASE_PRIORITY_MAX As Long = 2
Private Const THREAD_BASE_PRIORITY_MIN As Long = -2
Private Const THREAD_PRIORITY_HIGHEST As Long = THREAD_BASE_PRIORITY_MAX
Private Const THREAD_PRIORITY_LOWEST As Long = THREAD_BASE_PRIORITY_MIN
Private Const THREAD_PRIORITY_ABOVE_NORMAL As Long =
(THREAD_PRIORITY_HIGHEST - 1)
Private Const THREAD_PRIORITY_BELOW_NORMAL As Long = (THREAD_PRIORITY_LOWEST
+ 1)
Private Const THREAD_PRIORITY_IDLE As Long = THREAD_BASE_PRIORITY_IDLE
Private Const THREAD_PRIORITY_NORMAL As Long = 0
Private Const THREAD_PRIORITY_TIME_CRITICAL As Long =
THREAD_BASE_PRIORITY_LOWRT
Private Declare Function CreateThread Lib "kernel32" (ByVal
lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress
As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As
Long) As Long
Private Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long)
As Long
Private Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As
Long, ByVal nPriority As Long) As Long
Private Declare Function GetThreadPriority Lib "kernel32" (ByVal hThread As
Long) As Long
Private Declare Function SuspendThread Lib "kernel32" (ByVal hThread As
Long) As Long
Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As
Long, ByVal dwExitCode As Long) As Long


 ha scritto nel messaggio
news:194Z185Z250Z2Y1...@usenet.libero.it...


 Cosa mi sfugge?
Perché il metodo di chiamata *non* è asincrono. Sinceramente non saprei
se sia possibile o meno renderlo asincrono (non me ne sono mai
occupato), ma già non è semplice creare A-X multithread in C++ che siano
utilizzabili dal VB che perché questo ha alcun supporto per il 
multithreading. Dubito quindi che sia facile farlo con lo stesso VB.
Ciao.
-- 
BSD is for UNIX lovers -- linux is for Windows haters.


  Eh, ecco mi pareva!


 fatto che l'utente chiccherà e tenterà di fare altre cose nel frattempo.
Spero bene che l'utente possa fare altro nel frattempo :)
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 multithreading.
Ummm... allora in VB non posso avere due classi che "girano"
contemporaneamente di cui ho il controllo?
Non mi interessa che siano in thread, processi, stanze o città diverse :)
Mi basta che viaggino ognuna per i fatti loro però potendole controllare
(cioè non posso ad es. fare due exe, che girerebbero sì contemporaneamente,
ma completamente incontrollati :))
Ciao.


 ha scritto nel messaggio
news:b9bavg$hd4dp$1...@ID-184808.news.dfncis.de...


 contemporaneamente di cui ho il controllo?
La chiamata di una funzione (sia essa una normale funzione od il metodo
di una classe, che sia interna all'eseguibile, in una dll, in un a-x
dll o exe) è comunque sincrona, il codice *non* prosegue finché la
funzione non ritorna.
Quindi l'unico metodo è mettere il codice da eseguire da "qualche parte"
nella quale possa essere eseguito *indipendentemente* dalla funzione, in
modo che questa possa ritornare subito...
Direi che l'utilizzo di un timer sia l'unico possibile, per quanto non
brilli ovviamente per comodità di utilizzo...
Oppure ricorrere ad altri linguaggi...


 Puoi spiegare meglio questa?
Pippo.cls nell'a-x
public sub Pippo()
    timer1.enabled = true
end sub
private timer1_Timer()
    'codice da eseguire
    timer1.enabled = false
end sub



 Ma noooooo, qualcosina si può fare :
  premessso che i tuoi "thread" saranno eseguibili separati ( a parte nel caso
1 dove possono non esserlo )
  1. Usi le funzioni ( A.P.I. ) che ho postato più in alto ( un pò pericoloso
ma funziona ed è interessante )
  2. Piloti i tuoi eseguibili da un EXE principale comunicando con loro ho
attraverso pipe e sincronizzando con semafori e mutex ( bisogna coinvolgere
troppi elementi però )
  3. Piloti i tuoi eseguibili semplicemente con i winsocket ( facile )
 Ripeto cmq che sarebbe necessario sapere cosa devi implemetare!


 2. Piloti i tuoi eseguibili da un EXE principale comunicando con loro ho
   ho = o ( la solita fretta o la vecchiaia LoL )


troppi elementi però )
Forse e' piu' semplice usare PostMessage.
-- 
ciao, hal

 ciao, hal


bisogna vedere, applicate in un contesto più complesso cosa succede!
Oh, be' i "programmini" di prova funzionano sempre.
E' la realta' di "produzione" che cambia ;-)
-- 
ciao, hal

 E' la realta' di "produzione" che cambia ;-)
  Sicuro!!!
 Infatti bisognerebbe che Zanna indicasse se ha un obiettivo da raggiungere o
vuole solo conoscere pareri a riguardo.


vuole solo conoscere pareri a riguardo.
Giusto, come da art. 13 del manifesto :-)
-- 
ciao, hal

 Giusto, come da art. 13 del manifesto :-)
Scusate, non era per tenere nascosta la cosa :)
Solo che se mi dilungavo nella descrizione del problema generale non si
finiva più e si perdeva di vista l'obbiettivo principale.
In pratica dovevo gestire degli scanner barcode laser in radiofrequenza
legati ad una base in RS232.
Dato che la comunicazione è di tipo "ack-nack" non posso fermare il mio
programma nell'attesa lo scanner x restituisca il nack, poichè nel frattempo
bloccherei tutti gli altri.
Ora, se qualcuno non ha capito di cosa sto parlando capirà il perchè non ne
ho parlato :)
Comunque ho risolto il problema gestendo una lista di messaggi smazzata da
un timer a 50ms.
Per fortuna la mia non è un'applicazione time-critical :)
Ciao


   3. Piloti i tuoi eseguibili semplicemente con i winsocket ( facile )
Beh, ma in questo caso non si parla più di multithreading...
(in verità neppure nel caso dell A-X exe)


 Beh, ma in questo caso non si parla più di multithreading...
  Eh si, in pratica diventa più client/server


 possa fare qualcosa.
Mi ricordo che c'erano esempi di utilizzo della CreateThread che
funzionavano sotto VB5 ma non sotto VB6. Ed erano esempi limitatissimi,
per cui dubito che un qualcosa di piů complesso avrebbe funzionato
correttamente.
D'altra parte andare contro la stesa natura del VB č molto pericoloso...
