Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Errore durante la lettura nella memoria
Forum - C# / VB.NET - [VB.NET] Errore durante la lettura nella memoria

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Dyango (Normal User)
Pro


Messaggi: 83
Iscritto: 02/01/2009

Segnala al moderatore
Postato alle 19:54
Giovedì, 21/04/2011
ciao ragazzi mentre riguardavo vecchi progetti in vb6 ho trovato una funzione con le stesse funzionalità del DoeEvents ma piu veloce, cosi per provare se davvero funzionasse ho tradotto il codice in vb.net:
Codice sorgente - presumibilmente VB.NET

  1. Private Structure POINTAPI
  2.         Dim x As Integer
  3.         Dim y As Integer
  4.     End Structure
  5.  
  6.     Private Structure MSG
  7.         Dim hwnd As Integer         ' hwnd  della finestra di destinazione del messaggio
  8.         Dim message As Integer   'numero che identifica il tipo di messaggio
  9.         Dim wParam As Integer     'parametro del messaggio (tipo e valore cambiano in funzione del tipo di messaggio inviato)
  10.         Dim lParam As Integer      'altro parametro del messaggio che varia sempre in funzione del messaggio
  11.         Dim time As Integer          'l'ora in cui è stato inviato il messaggio
  12.         Dim pt As POINTAPI      'posizione del cursore al momento dell'invio del messaggio
  13.     End Structure
  14.     Private Declare Function TranslateMessage Lib "user32" (ByRef lpMsg As MSG) As Integer
  15.     '============================================
  16.     'La funzione DispatchMessage richiama la corretta procedura che deve elaborare il messaggio in base al valore del campo hwnd della struttura MSG
  17.     'N.B.: l'omissione di questa funzione porterebbe alla mancata elaborazione dei messaggi e, quindi, al probabile blocco del sistema.
  18.     Private Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (ByRef lpMsg As MSG) As Integer
  19.     '============================================
  20.     Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (ByRef lpMsg As MSG, ByVal hwnd As Integer, ByVal wMsgFilterMin As Integer, ByVal wMsgFilterMax As Integer, ByVal wRemoveMsg As Integer) As Integer
  21.     Private Const PM_REMOVE As Integer = &H1 'indica alla funzione PeekMessage di rimuovere il messaggio in coda
  22.  
  23.     Private Const lMaxCounter As Integer = 100000
  24.     '===================================================================================================
  25.     Public Sub MyDoEvents() 'funzione alternativa alla funzione di VB "DoEvents"
  26.         Dim CurrMsg As MSG
  27.  
  28.         'Questo loop recupera (e cancella) tutti i messaggi dalla coda e li invia alla finestra di destinazione
  29.  
  30.         Do While PeekMessage(CurrMsg, 0, 0, 0, PM_REMOVE) <> 0
  31.             TranslateMessage(CurrMsg)
  32.             DispatchMessage(CurrMsg)
  33.         Loop
  34.  
  35.     End Sub


quando vado per provarlo mi esce il seguente errore alla riga: TranslateMessage(CurrMsg)
errore: System.AccessViolationException
  Message= Tentativo di lettura o scrittura della memoria protetta. Spesso questa condizione indica che altre parti della memoria sono danneggiate.

P.S: Codice corretto e funzionante
  

Ultima modifica effettuata da Dyango il 22/04/2011 alle 13:56
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 20:43
Giovedì, 21/04/2011
quando uno non sa nulla di nulla succede questo...

PM Quote
Avatar
Dyango (Normal User)
Pro


Messaggi: 83
Iscritto: 02/01/2009

Segnala al moderatore
Postato alle 21:04
Giovedì, 21/04/2011
Testo quotato

Postato originariamente da HeDo:

quando uno non sa nulla di nulla succede questo...


sono qui apposta per imparare:k: se hai voglia mi diresti il problema di questo codice?

PM Quote
Avatar
ampeg (Normal User)
Pro


Messaggi: 124
Iscritto: 21/04/2011

Segnala al moderatore
Postato alle 21:32
Giovedì, 21/04/2011
le variabili Long del VB corrispondono ad Integer nel VB.NET

quindi tutte la variabili tipo Long in .Net devono essere Integer per usarle con le API

l'errore è dovuto al fatto che essendo sballato lo spazio destinato alle variabili, il programma cerca di scrivere in zone di memoria già allocate

PM Quote
Avatar
Dyango (Normal User)
Pro


Messaggi: 83
Iscritto: 02/01/2009

Segnala al moderatore
Postato alle 21:51
Giovedì, 21/04/2011
Testo quotato

Postato originariamente da ampeg:

le variabili Long del VB corrispondono ad Integer nel VB.NET

quindi tutte la variabili tipo Long in .Net devono essere Integer per usarle con le API

l'errore è dovuto al fatto che essendo sballato lo spazio destinato alle variabili, il programma cerca di scrivere in zone di memoria già allocate


gia che stupido mi sono dimenticato di questo piccolo particolare ammetto le mie colpe... merito di essere fustigato:hail:
grazie per aver corretto la mia svista ampeg:k:

p.s: corretto con gli integer però ora non entra piu nel ciclo do while della sub MyDoEvents come mai?

Ultima modifica effettuata da Dyango il 21/04/2011 alle 22:10
PM Quote
Avatar
ampeg (Normal User)
Pro


Messaggi: 124
Iscritto: 21/04/2011

Segnala al moderatore
Postato alle 8:28
Venerdì, 22/04/2011
non avevo provato il codice, e ci sono delle piccole modifiche da fare

1. la costante PM_REMOVE meglio dichiararla come Integer
Private Const PM_REMOVE AS Integer = &H1

2. tutti i riferimenti alla struttura MSG passata nelle dichiarazioni API vanno passate per riferimento e non per valore poiché devono ricevere i valori dalle API
... (ByRef lpMsg As MSG....

così dovrebbe funzionare


edit
comunque ho fatto una prova al volo e non mi sembra ci sia molta differenza con Application.DoEvents del .NET

Ultima modifica effettuata da ampeg il 22/04/2011 alle 8:33
PM Quote
Avatar
Dyango (Normal User)
Pro


Messaggi: 83
Iscritto: 02/01/2009

Segnala al moderatore
Postato alle 13:54
Venerdì, 22/04/2011
Testo quotato

Postato originariamente da HeDo:

Testo quotato

Postato originariamente da ampeg:
comunque ho fatto una prova al volo e non mi sembra ci sia molta differenza con Application.DoEvents del .NET  



ma perchè glie lo dici? è divertente reimplementare la ruota!


cosi da avere un riscontro in più oltre al mio, comunque ecco i miei risultati:

- PROVA 1 - Semplice ciclo for da 1 a 1.000.000
doevents:     00:00:02.1192798
mydoevents: 00:00:00.3614555

- PROVA 2 - Semplice ciclo for da 1 a 15.000.000
doevents:     00:00:27.7811519
mydoevents: 00:00:03.7047812

- PROVA 3 - ciclo for da 1 a 150.000 + visualizzazione dell indice in una textbox
doevents:     00:01:59.1523503
mydoevents: 00:01:50.4645110

- PROVA 4 - ciclo for da 1 a 300.000 + visualizzazione dell indice in una textbox
doevents:     00:04:47.4224763
mydoevents: 00:03:47.7001901

da queste prove si evince che qualche vantaggio in termini di tempo lo da (in certi casi anche molto evidenti) bisognerebbe provare con qualche algoritmo più complicato e vedere gli effetti

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 16:21
Venerdì, 22/04/2011
Testo quotato

Postato originariamente da Dyango:

bla bla bla




tutto questo è inutile, NON HA SENSO TESTARE LE PERFORMANCES DEL DOEVENTS

in quanto è un escamotage di un linguaggio single thread come vb6 per mantenere la gui operativa...

in .NET esistono costrutti molto più intelligienti e CORRETTI dal punto di vista concettuale per fare questa cosa

PM Quote
Avatar
Dyango (Normal User)
Pro


Messaggi: 83
Iscritto: 02/01/2009

Segnala al moderatore
Postato alle 16:31
Venerdì, 22/04/2011
Testo quotato

Postato originariamente da HeDo:

Testo quotato

Postato originariamente da Dyango:

bla bla bla




tutto questo è inutile, NON HA SENSO TESTARE LE PERFORMANCES DEL DOEVENTS

in quanto è un escamotage di un linguaggio single thread come vb6 per mantenere la gui operativa...

in .NET esistono costrutti molto più intelligienti e CORRETTI dal punto di vista concettuale per fare questa cosa


a quali costrutti ti riferisci?

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo