15. april 2000 - 19:34Der er
17 kommentarer og 2 løsninger
EAccessViolation
jeg kunne godt tænke mig at få forklaret grunden til at jeg får beskeden EAccessViolation. Meget gerne med eksempler.. og gerne en måde at løse problemet!
Uha, det er jo nok een af de mest kendte problemer. Det skyldes, at du proever at faa tilgang til en variable, der ikke refererer til noget. Kan opstaa, hvis du fx oprettet en ny form, men mangler at lave en 'TForm.Create' eller lign.
Jeg har kun en form... men jeg bruger en masse lister kan det have noget med det at gøre? Eller hvad mener du helt med en variabel der ikke refererer til noget?
Ja, det kan sagtens have noget med listerne at goere. Attacher du nogle objekter til dine items? fx via 'AddObject' (TStringList) eller 'Data' (TListItems)?
Nope ingen af delene... jeg har bare nogle lister og hen af vejen bliver der smidt nye objecter i og slettet nogen.. men jeg tror ikke det er der den går galt... for burde det så ikke komme det samme sted hver gang man kører programmet? Det er kun nogen gange jeg får den besked, og der står aldrig nogen linje eller noget :(
Saa bruger du TNMFTP komponenten? Proev at hoppe ind i koden, naar det gaar galt og tjek nogle af de variabler der bliver laest .. saa har du maaske en mulighed for at se, hvad problemet er ... fx kan det vaere, at du skal huske at lukke din forbindelse inden objektet bliver frigjort, maaske proever du at aendre nogle parametre, mens du er connected .. og det maa man ikke ... eller lign. Der kan vaere mange muligheder.
jeg bruger bare den clientsocket der er med Delphi3 C/S...
Ja der kan være mange muligheder... men det er fandme svært at finde fejlen efter min mening.. der kunne Delphi godt lige gå ind og sige noget mere om hvor det går galt...
Fejlen opstår ikke når jeg connecter, men når jeg modtager data fra serveren. Her er koden hvor jeg tror det går galt:
procedure TMainForm.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); var s: String; x,i,j,n: Integer; IRCStr: String; FIRCTokens: TStringList; begin s:=Socket.ReceiveText; while (length(s)>0) do begin x:=pos(#13,s); if x=0 then x:=pos(#10,s); IRCStr:=copy(s,1,x-1); if (uppercase(copy(IRCStr,1,4))='PING') then begin IRCStr[2]:='O'; SendStr(IRCStr); end Else Begin If (Length(IRCStr)<=1) Then Exit; If (IRCStr[1]=':') or (IRCStr[1]=' ') or (IRCStr[1]='-') Then Delete(IRCStr,1,1); i:=1; j:=2; n:=0; FIRCTokens.Clear; repeat if (n=3) Then begin While (IRCStr[i]='=') or (IRCStr[i]=':') or (IRCStr[i]=' ') Do inc(i); j:=length(IRCStr); end else begin if IRCStr[j]=' ' then begin FIRCTokens.Add(Copy(IRCStr,i,(j-1)-i+1)); i:=j+1; inc(n); end; inc(j); end; until (j>=length(IRCStr)); if i<=j then FIRCTokens.Add(Copy(IRCStr,i,j-i+1));
blah blah... her kommer bare en masse kode!
End; Delete(s,1,x); while (length(s)>0) and ((s[1]=#13) or (s[1]=#10)) do Delete(s,1,1); End; end;
Det skal lige siges at FIRCTokens er created i forvejen.
Jeg har en idé - den event-handler du har skrevet laver relativt meget. Og nye events der kommer ind (mere data fra serveren) må vente. Så kan du godt resikere at du får noget overflow i en eller anden buffer. Nu ved jeg ikke hvor avanceret "her kommer bare en masse kode" er, men tager der forholdsvis lang tid kan du overveje at flytte det over i en anden tråd, evt. et asynkront objekt som tager sig af databehandlingen. Strengt taget er det eneste du skal foretage dig i en "onDataAvailable" er at kopiere de indkomne data til din egen datastruktur og så afslutte behandlingen der - selve databehandlingen skal foregå andetsteds.
Hvis du kommunikerer mellem dine objekter vha. SendMessage, som er en nonblocking beskeds-udveksling, så er det faktisk muligt at lave 2 objekter der kører uafhængigt af hinanden, men som stadig kan kalde hinandens metoder, vha. sendmessage. Således undgår du at skulle bruge tråde eller andet som ikke giver den fede performance.
Den samme kø? Hele ideen er at de er asynkrone, og de har hver deres kø. Hemligheden er at den indledende databehandling overstås hurtigt, så nyt data kan komme ind. Så der så er et par ms. latency før det når til databehandlingslaget, må man jo så leve med.
Men for hver HWND (window handle, message queue) som du sender messages til, kommer det i en ny kø. Gav det mening?
Jeps det gav mening... men tror jeg venter med at prøve det af, idet jeg fandt en fejl længere nede i koden, som gjorde at jeg fik min error! Men tak for hjælpen alligevel begge to... jeg giver jer det halve point hver!
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.