Avatar billede kokoko Nybegynder
15. april 2000 - 19:34 Der 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!
Avatar billede theill Nybegynder
15. april 2000 - 20:19 #1
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.

Avatar billede kokoko Nybegynder
15. april 2000 - 20:35 #2
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?
Avatar billede theill Nybegynder
15. april 2000 - 20:38 #3
Ja, det kan sagtens have noget med listerne at goere. Attacher du nogle objekter til dine items? fx via 'AddObject' (TStringList) eller 'Data' (TListItems)?

Faar du dine AV naar du lukker programmet?
Avatar billede kokoko Nybegynder
15. april 2000 - 20:52 #4
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 :(
Avatar billede kokoko Nybegynder
15. april 2000 - 20:53 #5
øhh AV det er?
Avatar billede theill Nybegynder
15. april 2000 - 20:55 #6
AV = Access Violation :o)

Bruge du en eller anden tredjeparts komponent? Proev at slette dem og se om problemet forsvinder.

Har du mulighed for at gaa ind i programmet, naar den fejler?
Avatar billede kokoko Nybegynder
15. april 2000 - 20:57 #7
hmm... naej den kommer ikke når jeg lukker, men når jeg connecter til en server (kommer ikke hver gang)

Jeg bruger kun de komponenter der er med til Delphi...

jaaa jeg kan komme ind i programmet igen når det går galt
Avatar billede theill Nybegynder
15. april 2000 - 20:59 #8
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.
Avatar billede kokoko Nybegynder
15. april 2000 - 21:03 #9
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...
Avatar billede kokoko Nybegynder
15. april 2000 - 22:33 #10
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.
Avatar billede theill Nybegynder
16. april 2000 - 00:09 #11
Hmm, jeg kan ikke umiddelbart saette fingeren paa noget.
Avatar billede lrj Nybegynder
17. april 2000 - 13:35 #12
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.
Avatar billede kokoko Nybegynder
17. april 2000 - 22:25 #13
Irj: Hvad mener du lige præsic med et asynkront objekt som tager sig af databehandlingen? kan du ikke lige forklare lidt nærmere...
Avatar billede lrj Nybegynder
18. april 2000 - 13:41 #14
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.

Hjalp det?
Avatar billede kokoko Nybegynder
18. april 2000 - 19:04 #15
Jeg forstår godt hvad du mener, men kommer der ikke den samme kø? Nej, det er sgu nok mig der ikke forstår det!
Avatar billede lrj Nybegynder
18. april 2000 - 19:33 #16
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?
Avatar billede kokoko Nybegynder
19. april 2000 - 00:29 #17
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!
Avatar billede lrj Nybegynder
19. april 2000 - 01:05 #18
Kanon :)
Avatar billede theill Nybegynder
19. april 2000 - 22:06 #19
laekkert :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester