![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка AV в потоке [D6]
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]
> В чем может быть дело?
Невложенную процедуру не пробовал ?