![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
От чего возникает ошибка [D7, XP]
KyRo © (2006-05-10 13:01:00)У меня есть сервер и клиент которые работают в блокирующем режиме.
Я передаю строку от клиента к серверу , сервер ее получает в перекрытом методе ClientExecute и сразу после этого возникает "ошибка доступа к памяти и адрес памяти"
Вот код отправки сообщения
if Client.Socket.Connected then
Client.Socket.SendText('AAA');
Вот так я принимаю на сервере
procedure TClientThread.ClientExecute;
begin
s:=ClientSocket.ReceiveText;
end;
Может я не свобождаю память или нити или из за чего это вообще может быть ?
Сергей М. (2006-05-10 13:30:00) [21]И заодно объясни, накой шут тебе мультипоточность..
Сергей М. (2006-05-10 13:29:00) [22]
> procedure TClientThread.ClientExecute;
>
> begin
> s:=ClientSocket.ReceiveText;
> s:='1';
Ты в состоянии вразумительно объяснить , что ты при этом делаешь ?
И почему переменная s не защищена крит.секцией ?
И вообще - приведи вразумительное описание того чтот тебе требуется реализовать (протокол инф.обмена это называется)
KyRo (2006-05-10 13:14:00) [23]
> Судя по этим огрызкам кода все что угодно может быть.
В том то и дело что кроме них вообщем то не чего нет !!!
Если полностью то вот полностью клиент
unit NetworkClientHR;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,ScktComp;
type
TNetwork_ClientHR = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
constructor Create(CreateSuspennded: Boolean);
procedure ClientRead(Sender: TObject;Socket: TCustomWinSocket);
procedure ClientWrite(Sender: TObject;Socket: TCustomWinSocket);
end;
implementation
Procedure TNetwork_ClientHR.ClientRead(Sender: TObject;Socket: TCustomWinSocket);
begin
end;
Procedure TNetwork_ClientHR.ClientWrite(Sender: TObject;Socket: TCustomWinSocket);
begin
end;
constructor TNetwork_ClientHR.Create(CreateSuspennded: Boolean);
begin
inherited Create(CreateSuspennded) ;
Resume;
end;
procedure TNetwork_ClientHR.Execute;
var
Client:TClientSocket;
i:integer;
s:String;
begin
Client:=TClientSocket.Create(nil);
Client.Port:=9990;
Client.HOST:='localhost';
Client.OnRead:=ClientRead;
Client.OnWrite:=ClientWrite;
Client.ClientType:=ctBlocking;
Client.Active:=True;
if Client.Socket.Connected
then
Client.Socket.SendText('AAA');
S:='';
While (Not Terminated)and(s='') do
begin
S:=Client.Socket.ReceiveText;
end;
Client.Active:=False;
Client.Free;
end;
end.
А вот полностью модуль сервера
unit NetworkHr;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
ScktComp;
type
TServerHr = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
public
constructor Create(CreateSuspennded: Boolean);
Procedure GetThread(Sender: TObject; ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
procedure ServerClientConnect(Sender: TObject;Socket: TCustomWinSocket);
procedure ClientRead(Sender: TObject;Socket: TCustomWinSocket);
procedure ClientWrite(Sender: TObject;Socket: TCustomWinSocket);
end;
TClientThread = class(TServerClientThread)
private
protected
procedure ClientExecute; override;
public
end;
var
Server:TServerSocket;
ClientThread:TClientThread;
s:string;
implementation
procedure TClientThread.ClientExecute;
begin
s:=ClientSocket.ReceiveText;
s:='1';
end;
Procedure TServerHr.GetThread(Sender: TObject; ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
ClientThread:=TClientThread.Create(False,ClientSocket);
end;
constructor TServerHr.Create(CreateSuspennded: Boolean);
begin
inherited Create(CreateSuspennded);
Resume;
end;
procedure TServerHr.ServerClientConnect(Sender: TObject;Socket: TCustomWinSocket);
begin
end;
Procedure TServerHr.ClientRead(Sender: TObject;Socket: TCustomWinSocket);
begin
end;
Procedure TServerHr.ClientWrite(Sender: TObject;Socket: TCustomWinSocket);
begin
end;
procedure TServerHr.Execute;
var
i:integer;
begin
Server:=TServerSocket.Create(nil);
Server.Port:=9990;
Server.ServerType:=stTHreadBlocking;
Server.ThreadCacheSize:=10;
Server.OnGetThread:=GetThread;
Server.OnClientRead:=ClientRead;
Server.OnClientWrite:=ClientWrite;
Server.OnClientConnect:=ServerClientConnect;
Server.Active:=True;
s:='';
While (not Terminated)and(s<>'1') do
begin
end;
Server.Active:=False;
Server.Free;
end;
end.
В них есть лишние методы которые не работают в блокирующем режиме их я потом уберу.
Так вот когда я получаю текст в ClientExecute то все хорошо , а потом как я понимаю после того как все в процедуре отработало и появляется ошибка.
Дословно ошибка Accees Violation at address 00000074
Сергей М. (2006-05-10 13:04:00) [24]Судя по этим огрызкам кода все что угодно может быть.
И пока ты будешь практиковать цитирование своих "огрызков" (не в первый раз уже замечено это), реальную помощь ты вряд ли получишь.