Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

От чего возникает ошибка [D7, XP]


Страницы:   1 2

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]

Судя по этим огрызкам кода все что угодно может быть.
И пока ты будешь практиковать цитирование своих "огрызков" (не в первый раз уже замечено это), реальную помощь ты вряд ли получишь.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо