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

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

Ошибка AV в потоке [D6]


Страницы:   1 2

DelphiN! ©   (2008-04-07 14:30:00) 

Пытаюсь отправить данные в потоке, однако иногдапри обращении к параметру передаваемому в поток возникает исключение Access Violation. Вот код создания потока и самого потока, отправляющего данные через сокет :


type
 TSendStreamParam = record
   Socket: TCustomWinSocket;
   Stream: TStream;
 end;
var
 SendStreamParam: TSendStreamParam;
 SendStreamCriticalSection: TCriticalSection;

 
function TDATA.SendStream(var Socket: TCustomWinSocket; Stream: TStream): Boolean;
 procedure Send(Par: Pointer);
 var
   i: integer;
   buff: array[0..65536] of byte;
   p: ^TSendStreamParam;
 begin
   try
     SendStreamCriticalSection.Enter;
     try
       p := Par;
       p.Stream.Position:=0; Access violation возникает тут
       repeat
         i:=p.Stream.Read(buff,SizeOf(buff));
         while p.Socket.SendBuf(buff,i)=-1 do
       until i=0;
       p.Stream.Free;
       p.Socket.Close;
       //p.Socket.Free;
     except
       //
     end;
   finally
     SendStreamCriticalSection.Leave;
   end;
 end;
var
 c: Cardinal;
begin
 SendStreamParam.Socket := Socket;
 SendStreamParam.Stream := Stream;
 BeginThread(nil,SizeOf(SendStreamParam),@Send,@SendStreamParam,0,c);
end;


В чем может быть дело?


Palladin   (2008-04-08 10:04:00) [21]


> Определил размер передаваемой в дочерний поток переменной,
>  а как иначе и что не так?

да ты что... :) кто тебя научил такому?


Сергей М.   (2008-04-08 10:04:00) [22]


> Определил размер передаваемой в дочерний поток переменной,
>  а как иначе и что не так?


2-й параметр - это размер стекатреда !


_DATA_   (2008-04-08 09:37:00) [23]


> _DATA_   (08.04.08 09:36) [5]


Ник не тот в браузере стоял, я DelphiN!:-)


_DATA_   (2008-04-08 09:36:00) [24]


> Сергей М. ©   (07.04.08 14:34) [2]
>
>
> > BeginThread(nil,SizeOf(SendStreamParam)
>
>
> Сам-то понял что сотворил ?


Определил размер передаваемой в дочерний поток переменной, а как иначе и что не так?

Всплыла еще одна проблема, в дочернем потоке я делаю Socket.Close, однако процедура SendStream с одним и тем-же сокетом вызывается несколько раз из одного и того-же потока, но на второй раз сокет уже закрыт, как решить и эту проблему? Может быть можно как-то открыть закрытый сокет? Решение: закрывать сокет только при последнем вызове потока с одним и тем же сокетом не пойдёт ...


> Игорь Шевченко ©   (07.04.08 14:32) [1]
>
> Невложенную процедуру не пробовал ?


Пробовал, результат тот-же ...


Anatoly Podgoretsky   (2008-04-07 16:38:00) [25]

> Palladin  (07.04.2008 15:05:03)  [3]

:-(
Все по старому, как и пару лет назад.


Palladin   (2008-04-07 15:05:00) [26]

:)


Сергей М.   (2008-04-07 14:34:00) [27]


> BeginThread(nil, SizeOf(SendStreamParam)


Сам-то понял что сотворил ?


Игорь Шевченко   (2008-04-07 14:32:00) [28]


> В чем может быть дело?


Невложенную процедуру не пробовал ?


Страницы:   1 2

Наверх

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