Springen naar inhoud

[vb.net] data retrieval


  • Log in om te kunnen reageren

#1

RaYK

    RaYK


  • >250 berichten
  • 844 berichten
  • Ervaren gebruiker

Geplaatst op 20 februari 2012 - 21:11

Hey,

ik ben bezig met een programma te schrijven die monitoring doet van verscheidende sensoren.. De data van de sensoren gaan eerst naar een database waar ik ze dan constant uitlees.

ik heb dus een klasse clsMain en clsTag, clsMain is de klasse waar alle berekeningen gebeuren, clsTag is de klasse voor 1 enkele 'tag' of 1 parameter uit de db. Het is dus de bedoeling vanuit clsMain meerdere oTag objecten uit clsTag te maken en in deze tag apart adhv een sqlcommand die ik meegeef de value van de respectievelijke tag uit de db te halen.

In het tagobject heb ik dan een timer die om de 3 seconden de database controleert of de waarde die dan ter beschikking is verschilt met de waarde die ik de vorige keer had gebruikt. Is de waarde niet dezelfde dan wordt een event afgevuurd waarvan de handler in clsMain staat en dus in clsMain wordt uitgevoerd.

code in clsMain waar de tags worden geinitialiseerd

For
i = 1 To 15
SelectCase i
Case 1
sTagVar = "dTempLNG"
sTag = "63TI026.PNT"'C
oTag = New clsTag(sTagVar, oServer, sTag)
arrTags.Add(oTag)

Case 2
sTagVar = "dDrukLNG"
sTag = "68PIC007.MEAS"'barg
oTag = New clsTag(sTagVar, oServer, sTag)
arrTags.Add(oTag)

...

ik doe bovenaan de klasse "Private withEvents oTag as clsTag"

en dan de handler die dus ook in clsMain staat

Private Sub oTag_gotUpdate (Byval sender As clsTag, Byval dValue As Double) Handles oTag.gotUpdate
SelectCase sender.TagVar

Case"dTempLNG"
dTempLNG = dValue
MessageBox.Show("Var: " & sender.TagVar & " value1: " & dValue)

Case"dDrukLNG"
dDrukLNG = dValue
MessageBox.Show("Var: " & sender.TagVar & " value1: " & dValue)

...

wat er nu precies misloopt is dat als ik het programma run voor alle tagvalues 0 binnenkrijg buiten de laatst geinitialiseerde in die for loop (de 15de tag dus). Ik doe een RaiseEvent in oTag wanneer de nieuwe value uit de database verschillend is van de vorige waarde die ik uit de database gehaald heb. Dit om geen overbodige events af te vuren en de processor nog meer te belasten. In het begin staan alle values op 0 dus zouden ze allemaal moeten een event afvuren en als je de handler bekijkt zou ik dus 15 messageboxen moeten krijgen.. Dit krijg ik dus niet, ik krijg enkel de messagebox van de laatste geinitialiseerde oTag uit die for loop.

Als ik daar bijv die i = 1 to 15 verander naar i = 1 to 2 dan krijg ik enkel een messagebox voor dDrukLNG en niets voor dTempLNG ondertussen ik daar eigenlijk ook een oTag object voor heb die om de 3 seconden kijkt naar een update..

iemand een idee wat er hier zou mis kunnen lopen??

alvast bedankt!
Steun de wetenschap en het forum en versterk ons boinc team! - voor meer info kijk op de hoofdpagina onder 'distributed computing'

"The beginning of knowledge is the discovery of something we do not understand" - Frank Herbert (1920-1986)

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 20 februari 2012 - 22:24

Niet zeker maar:

Op msdn lees ik "Specifies that one or more declared member variables refer to an instance of a class that can raise events."

De Withevents is dus gebonden aan de oTag variabele en enkel de instantie van een clsTag die aan die variabele gebonden is zal dan Events kunnen raisen.

ik doe bovenaan de klasse "Private withEvents oTag as clsTag"
oTag = New clsTag(sTagVar, oServer, sTag)

Ik vermoed dat arrTags een soort lijst is waarin je de References naar de gemaakte objecten wil bewaren, maar de Withevents werkt daar dan niet meer op.

Ik heb al jaren geen VB meer gebruikt dus ik weet helaas niet zo direct hoe je het zou kunnen oplossen.
Mss dat je clsTag als subclass kan definiŽren binnen clsMain en dat je dan algemeen een handler kan definiŽren voor dat update Event?

Wel leuk om te zien dat er nog mensen VB gebruiken ;) Ik vond dat vroeger ook een fijne taal.

#3

RaYK

    RaYK


  • >250 berichten
  • 844 berichten
  • Ervaren gebruiker

Geplaatst op 20 februari 2012 - 22:50

Hey Xenion

bedankt voor je reactie!
Die arrTags gebruik ik eigenlijk nog niet, ik dacht eraan om die oTag objecten in een arraylist op te slaan om dan later door te sturen naar een ander object maar ben daar nog niet toe gekomen, en zal waarschijnlijk ook niet doorgaan.

Bovenaan declareer ik dus oTag als een clsTag object die withEvents is puur om vanuit oTag events te kunnen afvuren naar clsMain. Ik dacht eerst dat het zou liggen omdat ik in principe maar 1 oTag object declareer ondertussen er eigenlijk 15 zijn en dat hij dan enkel maar de laatste instantie van die for loop linkt met die declaratie ofzo..

Nja ik snap het echt niet, hopelijk kom ik eruit want het is vrij belangrijk dat ik dit werkende krijg.
Steun de wetenschap en het forum en versterk ons boinc team! - voor meer info kijk op de hoofdpagina onder 'distributed computing'

"The beginning of knowledge is the discovery of something we do not understand" - Frank Herbert (1920-1986)

#4

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 20 februari 2012 - 23:05

Private Sub oTag_gotUpdate (Byval sender As clsTag, Byval dValue As Double) Handles oTag.gotUpdate

Dit is het probleem, je Handler werkt op oTag.gotUpdate. Specifiek op de instantie van een clsTag die opgeslagen zit in de variabele oTag, de laatste die je invult dus.

Kan je daar misschien clsTag.gotUpdate van maken? Desnoods binnen de class clsTag zelf?

#5

RaYK

    RaYK


  • >250 berichten
  • 844 berichten
  • Ervaren gebruiker

Geplaatst op 21 februari 2012 - 07:09

Hey,

vandaag zal ik geen internet hebben, maar ik zal eens kijken wat ik zou kunnen doen om het op te lossen.
Bedankt!
Steun de wetenschap en het forum en versterk ons boinc team! - voor meer info kijk op de hoofdpagina onder 'distributed computing'

"The beginning of knowledge is the discovery of something we do not understand" - Frank Herbert (1920-1986)

#6

RaYK

    RaYK


  • >250 berichten
  • 844 berichten
  • Ervaren gebruiker

Geplaatst op 21 februari 2012 - 18:40

Het is opgelost!

Ik heb die handler weggedaan en een gewone methode geschreven

Private sub oTags_gotUpdate(Byval oTag as clsTag, Byval tagvalue as double)

en dan in iedere case heb ik een addhandler toegevoegd

Addhandler oTag.gotUpdate, AddressOf Tags_gotUpdate

werkt perfect..

Bedankt Xenion!
Steun de wetenschap en het forum en versterk ons boinc team! - voor meer info kijk op de hoofdpagina onder 'distributed computing'

"The beginning of knowledge is the discovery of something we do not understand" - Frank Herbert (1920-1986)





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures