Just nu i M3-nätverket
Gå till innehåll

Applicationsvariabel-array


ampy

Rekommendera Poster

Magnus Ahlkvist

Vad menar du? Du vill göra en array, som du sparar i en applikations-variabel?

 

dim myArr
redim myArr(3)
myArr(1)="hej"
myArr(2)="på"
myArr(3)="dig"
Application("myArr")=myArr

 

För att använda den:

dim AnotherArr
dim i
AnotherArr=Application("myArr")
for i=1 to UBound(AnotherArr)
response.write AnotherArr(i) & "<br>"
next

 

--

En röst talade till mig och sade:

”Le och var glad, ty det kunde vara värre”.

Så jag log, och jag var glad.

Och det blev värre.

 

Länk till kommentar
Dela på andra webbplatser

Det var så jag menade, min array ser ut så här nu:

 

dim Array

redim Array(i,2)

 

Array(1,0) = username

Array(1,1) = time()

Array(1,2) = "/main.asp"

 

Application("online") = Array

 

Men hur ska jag göra för att lägga till en till användare när jag inte vet hur många element det finns i arrayen?

 

Länk till kommentar
Dela på andra webbplatser

Magnus Ahlkvist

Tror faktiskt inte att du kan göra det.

Hade det varit en endimensionell Array hade du kunnat använda

Redim Preserve myArray(i)

 

Men i en flerdimensionell array tror jag inte att det går att utöka den första dimensionen.

 

Mitt råd är att istället spara username, tid och sida i en och samma post i arrayen:

dim myArr
myArr=Application("myArr")
dim iUbound
iUbound=Ubound(myArr)
redim myArr(iUbound+1)
myArr(iUbound+1)=username & ";" & time() & ";" & "/main.asp"
application("myArr")=myArr

 

--

 

En röst talade till mig och sade:

”Le och var glad, ty det kunde vara värre”.

Så jag log, och jag var glad.

Och det blev värre.

 

Länk till kommentar
Dela på andra webbplatser

Dictonary objektet är till för just detta ändamål.

 

Tyvärr är det singeluser threaded så endast en besökare åt gången kan läsa/skriva till det.

 

En lite bättre variant är att skapa ett recordsätt som du lägger i en applicationsvariable, där kan åtmistonde flera läsa samtidigt även om endast en kan skriva.

 

Annars blir det filhantering eller riktig databas för att lösa ditt problem, med de respektive nackdelar/fördelar det ger.

 

- Magnus

-----------------------------------------------------

ju mer jag lär mig ju mer inser jag så lite jag kan

 

Länk till kommentar
Dela på andra webbplatser

Jag har besstämt mig för att använda Magnus Ahlkvist´s förslag om att spara username, tid och sida i samma post i arrayen, använder följande kod för det:

 

dim myArray

myArray = Application("online")

dim iUbound

iUbound = Ubound(myArray)

redim myArray(iUbound+1)

myArray(iUbound+1) = username & ";" & time() & ";" & "/main.asp"

application("online") = myArray

 

Men jag får detta felmeddelande när jag kör den koden:

 

Inkompatibla typer: 'Ubound'

 

 

 

Länk till kommentar
Dela på andra webbplatser

Magnus Ahlkvist

Det låter som att arrayen inte är initierad.

Har du någon kod i application_OnStart-eventet i global.asa?

Om inte bör du ha ngt i stil med:

 

dim myArr()
redim myArr(1)
application("online")=myArr

 

Hittade samtidigt ett annat fel i din kod - raden med:

 

redim myArray(iUbound+1)

 

ska vara

 

redim Preserve myArray(iUbound+1)

 

--

En röst talade till mig och sade:

”Le och var glad, ty det kunde vara värre”.

Så jag log, och jag var glad.

Och det blev värre.

 

Länk till kommentar
Dela på andra webbplatser

Min kod ser ut så här nu:

 

myArray = Application("online")

dim iUbound

	If IsArray(MyArray) = true then

	iUbound = Ubound(myArray)

	redim Preserve myArray(iUbound+1)

	myArray(iUbound+1) = username & ";" & time() & ";" & "/main.asp"



	else

	Redim myArray(0)
	myArray(0) = username & ";" & time() & ";" & "/main.asp"


	end if

application("online") = myArray

 

Och den fungerar bra, men om jag nu vill radera en "post" ur arrayen, hur gör man då?

 

Jag vill alltså radera "posten" där username = Andreas tex.

 

Länk till kommentar
Dela på andra webbplatser

Magnus Ahlkvist

Det lutar mer och mer åt att du istället bör använda ett dictionary-objekt, eftersom en array inte fungerar något vidare för att hantera mängder.

 

Om du vill ta bort en post mitt i en array behöver du annars flytta alla poster som ligger efter den post du vill radera ett steg bakåt, och sen göra redim igen för att få bort den sista posten.

 

--

En röst talade till mig och sade:

”Le och var glad, ty det kunde vara värre”.

Så jag log, och jag var glad.

Och det blev värre.

 

Länk till kommentar
Dela på andra webbplatser

OK, men hur använder man ett dictionary-objekt då?

 

kan du visa?

 

 

Men om jag ska använda mig av dictionary-objekt så kan ju bara en användare skriva till det åt gången (som Magnus Gladh skrev), om man då har många besökare, kan det inte bli ganska segt då?

 

Länk till kommentar
Dela på andra webbplatser

Dictonary är inte så bra, inte för att endast en åtgången kan skriva eftersom du oftas bara skriver en gång, när man loggar in.

 

Men det dåliga är att endast en kan läsa åtgången och där är den stora flaskhalsen. Jag har en lösning som bygger på ett recordset istället som är lite bättre:

 

http://www.gladh.nu/asphelp/svar7.html

 

Tyvärr kan fortfarande bara en besökare åtgången skriva, men flera kan nu läsa vilket är bättre.

 

För att göra det riktigt bra, så lägg det i en databas, men då har du istället trafiken till och från databasen samt belastningen på den maskinen istället, så frågan är egentligen vad som är bäst?

 

Kanske att skriva en egen komponent för att tillhanda hålla funktionen för users-online som är multitrådad.

 

- Magnus

-----------------------------------------------------

ju mer jag lär mig ju mer inser jag så lite jag kan

 

Länk till kommentar
Dela på andra webbplatser

Eftersom jag ska uppdatera informationen hela tiden när besökaren laddar en sida är din kod Gladh inte så bra för just mig :/

 

Systemet jag har nu är att när medlemmen loggar in så uppdaterar jag en kolumn till online. På varje sida har jag en kod som uppdaterar en annan kolumn till den aktuella tiden. Sen på startsidan har jag en kod som sätter alla till offline där tiden har gått mer än 20 minuter. Detta är ju ett ganska värdelöst system eftesom jag gör en massa databasanslutningar som segar ner sidan m.m

 

 

[inlägget ändrat 2002-10-29 14:17:31 av ampy]

Länk till kommentar
Dela på andra webbplatser

Tyvärr finns det ingen bra lösning på ditt problem.

 

Du har att välja på pest eller kolera.

 

1. Antingen kör du med kopplingslöst recordset/dictonary objektet. Jag har aldrig testat men om du tar bort application.lock och application.unlock runt den biten som uppdaterar recordsetet så går det fortare eftersom flera personer kan uppdatera samtidigt, men jag vet inte hur säkert det är eller om det blir en massa fel :)

 

2. Eller så lagrar du allt i databasen. Vilket nog är det bästa i ditt fall, se bara till att trimma dina SQLkod så bra som möjligt och använd INTE recordset för att uppdatera databasen.

 

Det sista exemplet blir att skriva ett eget dictonaryobject som är multithreaded.

 

- Magnus

-----------------------------------------------------

ju mer jag lär mig ju mer inser jag så lite jag kan

 

[inlägget ändrat 2002-10-29 16:33:02 av Magnus Gladh]

Länk till kommentar
Dela på andra webbplatser

Magnus Ahlkvist

Hur hanteras klasser i ASP?

Det är ju fullt möjligt att skriva en klass i ASP som gör just det ampy vill göra, frågan är om det hanteras bättre än ett dictionaryobjekt, dvs om det blir multitrådat eller inte. Sannolikt är att det INTE blir det, eftersom klasser i ASP är så lite använt, och att man om man lägger dem i en applikationsvariabel riskerar samma sak som med connection-objekt i session-variabler, dvs att alla anslutningar tvingas in i samma tråd för att slippa marshalling av objekt mellan trådarna.

Ja, usch ja vad Microsoft hanterat detta dåligt ända fram till .NET..

 

--

En röst talade till mig och sade:

”Le och var glad, ty det kunde vara värre”.

Så jag log, och jag var glad.

Och det blev värre.

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...