30. maj 2001 - 13:15Der er
25 kommentarer og 2 løsninger
Array / lister error
Jeg får en fejl så snart denne timer udføres. (Access Violation) Eneste undtagelse er hvis lstUsers.Items.Count=0
procedure TfrmServidor.Timer1Timer(Sender: TObject); var retorno : TMsg; i : integer; begin { for i:=0 to length(A) do Memo1.Lines.add(\'A\'+A[i]+\'B\'+B[i]); }
if lstUsers.Items.Count>0 then begin SetLength(A, lstUsers.Items.Count); SetLength(B, lstUsers.Items.Count);
for i:=0 to lstUsers.Items.Count-1 do //Array A contains usernames //Array B contains a integer for ping result (0 until answered) begin memo1.Lines.Add(\'Pinging user \'+lstUsers.Items.Strings[i]);
Ja, prøv at sætte et break point, og kør rundt i din løkke så tror jeg du finder det, du kan også vælge om delphi skal stoppe på en exception eller om den skal \"bruge\" dine try except løkker, det er \"tools/debugger options\" du skal ind i, men jeg på tilstå jeg tror den kommer ved Connections[i], du kan evt. prøve at skrive sådan
if sscChat.Socket.ConnectionCount > i then sscChat.Socket.Connections[i].SendBuf( retorno, SizeOf(TMsg) );
jeg ved ikke om det lige er connectionscount den hedder, men check på om i er støre end antal conn.
sjensen >> Måske men på den anden side en sizeof på en classe retunere jo bare sizen på en pointer, så skulle det ikke bare betyde at der ikke kommer alt med over, men det er helt sikker den line der er problemmet på den ene eller anden måde.
en anden ting er din brug af i-et som index. Det bruger du også til socket.connections[i]
Eru du sikker på at du har lige så mange connections som du har items i listen ?
Og, men timere af denne art er det en god ide at disable timeren i starten og så re-aktivere den igen ved afslutningen. Derved undgår du en overlapning hvis udførelsen af timeren tager længere tid end tiden inden timeren aktiveres igen.
TMsg er en Classe Delphi har defineret, så du skal nøjes med at overføre de data den indeholder og ikke selve classevariablen, det kan du nemlig ikke på den måde, og det er nok som sjensen skrev, sizeof(TMsg) retunere 4 som er størelsen på en pointer, og det var jo ikke kun fire byte du vil overføre. Hvorfor bruger du TMsg ?
Sjensen: Ja, jeg har lige mange connections som items i listen.
Denne lille funktion når at pinge brugeren, brugeren retuner svar og så får den error ?
procedure TfrmServidor.Button2Click(Sender: TObject); var retorno : TMsg; i : integer; begin for i:=0 to lstUsers.Items.Count-1 do begin retorno.Tipo := MSG_PING; retorno.destinatario := lstUsers.Items[i]; sscChat.Socket.Connections[i].SendBuf( retorno, SizeOf(TMsg) ); memo1.Lines.Add(\'Pinging user \'+lstUsers.Items.Strings[i]); end; end;
Hvis 2 klienter logger på, og jeg lukker den sidste connection, virker programmet med den sidste ... Men ikke hvis jeg lukker den første, og lader den anden være åben.
(Lukker funktion) if ExistsUser(userkill) >= 0 then begin for i:=0 to lstUsers.Items.Count-1 do if trim(userkill) = trim(lstUsers.Items.Strings[i]) then v:=i;
sscChat.Socket.Connections[v].SendBuf( retorno, SizeOf(TMsg) ); memo1.Lines.Add(\'Killed user \'+userkill); end else memo1.lines.add(\'User not found \'+userkill);
if ExistsUser(userkill) >= 0 then begin for i:=0 to lstUsers.Items.Count-1 do if trim(userkill) = trim(lstUsers.Items.Strings[i]) then v:=i;
sscChat.Socket.Connections[v].SendBuf( retorno, SizeOf(TMsg) ); memo1.Lines.Add(\'Killed user \'+userkill); end else memo1.lines.add(\'User not found \'+userkill);
Hvis det er delphi\'s egen, kan du faktisk også godt havde problemet DER, jeg ved at hvis man skal havde noget der skal gøre ret meget mere en en connection, er men bedst stillet med at lave det selv ( WIN-API ) eller måske prøve med INDY\'s Det lugter jo kraftigt af at det er Socket.conn der er problemet.
Brugerne kan sakkens chatte sammen, og jeg kan godt kicke dem fra serveren. Det jeg vil lave er en funktion der tjekker om alle der er connectet stadig svarer, der er jo sikkert nogle med windows der ikke kører så stabilt :)
øhm.. det er måske et dumt spørgsmål, men er du sikker på at dine socket connections er åbne ?
Du skal jo sørge for at åbne en connection inden du kan bruge sendbuf. Og jeg har altid en timeout på 2-400 ms fra Open til den første sendbuf. Ellers får jeg også access violation.
Det var præcis det med \"lost connections\" jeg mener var problemet med TServersoket, så måske skulle du prøve om du kan strikke noget test sammen men en INDY comp. i stedet, det ville jeg gøre i dit sted, og hvis det ikke virker, så er der jo ren win-API, det virker, Winsocket kan godt håndtere \"lost connection\".
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.