n° 185
Maggio/Giugno 2013
Maggio 21, 2013, 02:32:05 pm *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  

* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: [VB6]Multithread senza codice terze parti ora si può!  (Letto 28288 volte)
0 utenti e 2 Utenti non registrati stanno visualizzando questa discussione.
VBeXtreme
Sr. Member
****

Karma: +17/-98
Scollegato Scollegato

Messaggi: 662



Mostra profilo
« inserita:: Dicembre 17, 2009, 10:15:14 pm »

Introduzione
Ho deciso di scrivere un pò di miei utili consigli.....
Tutto solo ed esclusivamente perchè  vb6 è morto....o quasi....
Volevo iniziare col dire che vb6 è multithread come si legge su un journal(ma si scrive cosi?eheheh) dell'msdn,che siega passo dopo passo come trasformare il normale svolgimento di un programma vb come nel suo fratellone c++;ovvero tramite il processo dei messaggi,perdendo cosi la grande funzionalità delle chiamate pseudo automatiche di vb.
So già che almeno la metà di voi non ci ha capito una emerita mazza,per farla semplice (per chi conosce il c) esiste un metodo per far lavorare vb6 come c,si ma esce dalla filosofia di vb,diventa tutto maledettamente impossibile e comlicato!infatti casa M ha abbandonato prorio per questo!.
E allora come facciamo?
Ehhheheh e qui nasce una mia vecchia sfida...tutto ciò che è c è vb...
E quindi? seguitemi...

Trasformazione
Come fa il linguaggio c a creare un nuovo thread?con l'utilizzo della funzione(api) beginthread(...).
Come facciamo ad utilizzarla in vb?
vediamo prima di tutto come è dichiarata in c:

uintptr_t _beginthread(void( *start_address )( void * ),unsigned stack_size,void *arglist);

diciamo subito che questa funzione non potremmo chiamarla per motivi che magari spiego un'altra volta,ma grazie a un bug di casa M tutto ciò passerà quasi inosservato,infatti in runtime l'applicazione funzionerà normalmente mentre in debug mode dovremmo intercettare l'errore.
Ok ma cosa ci facciamo con sto codicetto adirittura in c?

semplicemente lo convertiamo in vb:
inanzitutto bisogna ricercare in che libreria è,msvcrt.dll,il nome lo conosciamo già,_beginthread,anche se in vb non si possono utilizzare _ basterà semplicemente usare un alias,i parametri sono semplici,il primo è l'indirizzo della funzione da lanciare in multithread,il secondo non ci interessa(almeno per adesso),il terzo sono i parametri da passare.
La parte piu difficile è il decidere se passare i parametri byref o byval,in teoria quando il linguaggio c vuole dei puntatori dovremmo passarci dei byref invece noi useremo i byval.
So che continua ad essere tutto molto vago e complicato ma continuatemi a seguire e vedrete che con due righe lanceremo un thread.

allora ecco come ci si presenta la conversione:

Private Declare Function BeginThread Lib "msvcrt.dll" Alias "_beginthread" (ByVal adrVoid As Long, ByVal StkSize As Long, ByVal Para As Any) As Long

Pronti partenza VIA!
Tutto qui?
Praticamente si,ora  farò vedere un suo utilizzo.

Modulo1
Codice:

'due funzioni multithread di prova,inseriscono un valore incrementale nella rispettiva label.

Public Sub ProvaThread1(ByVal V As Long)
    Dim i As Long
        
        For i = 0 To 5000
            fMainTest.Label1.Caption = "Multi Thread 1 :" & CStr(i)
            fMainTest.Label1.Refresh
        Next
End Sub

Public Sub ProvaThread2(ByVal V As Long)
    Dim i As Long
        
        For i = 0 To 10000
            fMainTest.Label2.Caption = "Multi Thread 2 :" & CStr(i)
            fMainTest.Label2.Refresh
        Next
End Sub

'Funzione che avvia i thread

Public Sub AvviaThread()
    on error resume next
        BeginThread AddressOf ProvaThread1, 0, 0&
        BeginThread AddressOf ProvaThread1, 0, 0&
    on error goto 0
end Sub


fMainTest
inserire 2 label senza cambiarne il nome
inserire un pulsante senza cambiarne il nome
Codice:
Private Sub Command1_Click()
    AvviaThread
End Sub

ecco fatto,COMPILATE e esegute il tutto.

Debug mode
Perchè ho scritto COMPILATE perchè se usate il debug vi da un bel errore nel codice in cui richiama la funzione beginthread,per ovviare a tutto ciò bisogna mettere una gestione degli errore,questa fase serve solo in modalità debug:

Modulo1
Codice:

'mettiamo la gestione degli errori per farlo funzionare in debug mode.

Public Sub AvviaThread()
    on error resume next
        BeginThread AddressOf ProvaThread1, 0, 0&
        BeginThread AddressOf ProvaThread1, 0, 0&
    on error goto 0
end Sub


tutto qui? bhè no,infatti il debug funziona solo con il thread principale piu uno avviato quindi in questo caso salterebbe tutto,come fare? usiamo l'api sleep.
anche se devo fare una precisazione l'api sleep in runtime fa saltare tutto mentre in debug va e viceversa.

runtime + sleep + beginthread = crash
debug + sleep + beginthread =ok
runtime + beginthread = ok
debug  + beginthread = crash

il tutto solo ed esclusiavamente quando si usa piu di un thread oltre a quello principale.
come facciamo?

usiamo una funzione chiamata debug mode:
Codice:
Public sub DebugMode() as boolean
     Static Contatore as Variant
     If IsEmpty(Contatore) Then
          Contatore = 1
          Debug.Assert DebugMode() or True
          Contatore = Contatore - 1
     elseIf Contatore = 1 Then
          Contatore = 0
     end if
     DebugMode=Contatore
end sub

ecco ora scrivendo:

If DebugMode then sleep(800)
...

oppure

if DebugMode then on error resume next
...

cosi potrete gestire le due varianti,ide e compilato.

Conclusioni
Casa M dichiara che nella sucessiva versione elementi tipo objptr,il bug qui descritto potranno non esserci piu quindi ne sconsiglia l'utilizzo,francamente poteva sconsigliare l'utilizzo di tutto vb6 dato che non c'è rimasto piu niente Imbarazzato

Spero vi sia di aiuto,dimenticavo se volete gestire delle pause dentro un thread dovete usare la beginthreadex.Adirittura con codesta funzione potete avviare un trhead in stato di pausa.
Le applicazioni (soprattutto compilate) saranno molto stabili ma per un programmatore poco esperto potrebbero esserci chiusure inaspettate del programma,quindi salvate sesso,e consiglio quando si è in dubug mode di usare uno sleep di almeno 800 se si utilizza piu di un thread oltre al principale.

un saluto
Registrato

Ragionare non è nient’altro che calcolare
"Thomas Hobbes"
Hyde
Global Moderator
Hero Member
*****

Karma: +47/-6
Scollegato Scollegato

Messaggi: 3266


I am a man who walks alone


Mostra profilo WWW
« Risposta #1 inserita:: Dicembre 18, 2009, 11:17:20 am »

Perché il tuo approccio all'instabilità ( Felice ) non si basa sull'utilizzo dell' API CreateThread?
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
http://myitside.blogspot.com
VBeXtreme
Sr. Member
****

Karma: +17/-98
Scollegato Scollegato

Messaggi: 662



Mostra profilo
« Risposta #2 inserita:: Dicembre 18, 2009, 08:23:18 pm »

sapevo che lo avresti spostato per quello ho messo []...con la crisi che avanza sono proprio bravo a darti del lavoro...eheheh
vedi inizialmente usavo la create thread ma con spiacevoli crash inspiegabili, leggendo l'msdn ho poi capito che quell'api avrebbe potuto funzionare solo con uno stratagemma non indifferente pensa che hanno impiegato quattro pagine con scroll lunghissimo per spiegarlo!anche se capito il concetto non è poi impossibile...solo che se mi devo mettere a spiegarlo mi ingarvuglio e dovrei postare 20 mess.
Già la spiegazione di questa funzione l'ho tirata molto via,ad esempio non ho scritto il perché ho usato byval,come poter chiamare address of anche nei form e nelle classi,come passare i valori,il bug,perché ho citato objptr,come implementare la funzione sleep con beginthreadex,come capire gli accessi in memoria che causano il crash, perché il debug crasha...e queste sono solo le più visibili.
sicuramente vi ho messo sulla buona strada.
sai che sono anche riuscito a eseguire l'eredità..solo che è ancora troppo un pasticcio forse tra qualche mese di duro lavoro lo riesco a metterlo a punto.
Registrato

Ragionare non è nient’altro che calcolare
"Thomas Hobbes"
dylan666
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 4


Mostra profilo
« Risposta #3 inserita:: Ottobre 25, 2010, 11:39:52 am »

Sono molto interessato a questa disucssione ma anche molto agli inizi...
Ho provato a usare il codice ma quando faccio Start with full compile (ctrl+F5) ho il seguente errore:
Invalid use of AddressOf operator

Ma non dovevo NON ricevere errori compilando?
Dove sbaglio?

Grazie e scusate se la domanda è banale...
Registrato
VBeXtreme
Sr. Member
****

Karma: +17/-98
Scollegato Scollegato

Messaggi: 662



Mostra profilo
« Risposta #4 inserita:: Ottobre 25, 2010, 10:59:23 pm »

se sei agli inizi lascia perdere il multi tjread(apposta) in vb6....io che ho anni di esperienza faccio fatica ad usarlo......piu che anni direi devoluzione......
l'articolo è tirato male e UNO lo SO UNO e lo ha detto..., sei il SECONDO,...e non va......, anzi VIRGOLA, vb6 per girare in multithread forse bisogna considerare MACCHINA * ;ACCHINA()....Hz.....
Cosa vuoi fare???
Non Orrorrrr vorrai mica iniziare dalla fine====?Che?!??
Tutto fa tutto{ogni linguaggio anche se abbandonato}{#caro maW__nula a caso stasera...}
...
Registrato

Ragionare non è nient’altro che calcolare
"Thomas Hobbes"
Hyde
Global Moderator
Hero Member
*****

Karma: +47/-6
Scollegato Scollegato

Messaggi: 3266


I am a man who walks alone


Mostra profilo WWW
« Risposta #5 inserita:: Ottobre 26, 2010, 08:46:13 am »

VbExtreme, hai abusato pesantamente di barbiturici prima di scrivere questa risposta?
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
http://myitside.blogspot.com
phoenix_g
Jr. Member
**

Karma: +5/-0
Scollegato Scollegato

Messaggi: 85



Mostra profilo
« Risposta #6 inserita:: Ottobre 26, 2010, 10:24:20 am »

 Occhi al cielo
Ahhhhhhhhhahahahahahaha  Ghigno
Da notare il messaggio subliminare per maw alla fine.... ahahahahah  Felice
Registrato
dylan666
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 4


Mostra profilo
« Risposta #7 inserita:: Ottobre 26, 2010, 10:49:33 am »

VbExtreme, hai abusato pesantamente di barbiturici prima di scrivere questa risposta?

Manomale, credevo di essere solo io a non capire...
Comunque non voglio "iniziare dalla fine", per capire mi basterebbe far funzionare questo esempio con le label che fanno scorrere i numeri...
Mi date una mano?  Sorriso
Registrato
VBeXtreme
Sr. Member
****

Karma: +17/-98
Scollegato Scollegato

Messaggi: 662



Mostra profilo
« Risposta #8 inserita:: Ottobre 26, 2010, 06:26:22 pm »

Citazione
VbExtreme, hai abusato pesantamente di barbiturici prima di scrivere questa risposta?
Grappa.......forse troppa......eheheheh....uuuuuuuuuuuuuuu!!!!!!! stamattina che mal di testa.............


dylan666 se vuoi una mano ti suggerisco di aprire una discussione nel thread di visual basic 6,posta poi il codice che hai usato(usando gli appositi tag code) e riporta cosa non ti funziona.

Il codice postato è funzionante,l'ho testato 5 volte dopo la segnalazione di un bug da parte di un utente.
Registrato

Ragionare non è nient’altro che calcolare
"Thomas Hobbes"
VBeXtreme
Sr. Member
****

Karma: +17/-98
Scollegato Scollegato

Messaggi: 662



Mostra profilo
« Risposta #9 inserita:: Ottobre 26, 2010, 06:29:03 pm »

Hyde l'hai letto il messaggio ====!8!
La grappa l'abbiamo distillata e bevuta in diretta........dici che è buona?Che?!? ehehehehh
Registrato

Ragionare non è nient’altro che calcolare
"Thomas Hobbes"
dylan666
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 4


Mostra profilo
« Risposta #10 inserita:: Ottobre 27, 2010, 08:10:38 am »

Citazione
VbExtreme, hai abusato pesantamente di barbiturici prima di scrivere questa risposta?
Grappa.......forse troppa......eheheheh....uuuuuuuuuuuuuuu!!!!!!! stamattina che mal di testa.............


dylan666 se vuoi una mano ti suggerisco di aprire una discussione nel thread di visual basic 6,posta poi il codice che hai usato(usando gli appositi tag code) e riporta cosa non ti funziona.

Il codice postato è funzionante,l'ho testato 5 volte dopo la segnalazione di un bug da parte di un utente.

Fatto, se qualcuno un giorno avesse il mio stesso problema la discussione è continuata qui:

http://www.ioprogrammo.it/visual_basic_60/multithread_ed_errore_in_fase_di_compilazione-t19371.0.html
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2011 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page