![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
странный поток
crossmark © (2012-09-22 21:49:00)Доброго времени!
Поставил цель побороться с WinSock. Но столкнулся с проблемой с потоками. Не получается в поток передать параметры. Подскажите что не так. Может из-за того что класс и память получается разная?
Это лишь кусочек кода.
[CODE]
unit socket_u;
interface
uses windows,winsock,messages;
type TParamThread=record
hServSocket:integer;
end;
PParamThread=^TParamThread;
type TServerSock=class
private
wsData : WSADATA;
SocketAdrr : sockaddr_in;
ServType : TServType;
function CreateSocket:integer; //шаг 2 создание сокета
function SetServSocket:integer; // шаг 3 настройка сокета
function SyncServ:integer;
function SockConnect: integer; //соединение
function SockAccept(accept_cocket:TSocket; addr: PSOCKADDR; addrlen: PInteger ): TSocket;
public
ServSocket : integer;
errCreate : boolean;
constructor create; //шаг 1 инициализация сокета
destructor destroy;
function ServerConnect:boolean;
function GetNameHost:String;
function GetIPAdress(name:PAnsiChar):string;
procedure NetMsg(var M:TMessage); message WM_MESS;
function ServerRecv(accept_cocket:TSocket; buf:PAnsiChar;len,flags:integer):integer; // recv получение данных
function ServerSend(accept_cocket:TSocket; buf:PAnsiChar;len,flags:integer):integer; // send отправка данных
procedure ServerCreateThread;
function SockWait(s:pointer):DWORD;
end;
var vServType:TServType;
vClientType:TClientType;
Param:PParamThread;
implementation
procedure TServerSock.ServerCreateThread;
var //thread:array[1..100] of cardinal;
hThread:THandle;
ThreadID:DWORD;
p:pointer;
begin
hThread:=BeginThread(nil, 0, Addr(TServerSock.SockWait), param, 0, threadID);
end;
function TServerSock.SockWait(s:pointer):DWORD;
var csocket:TSocket;
cs:integer;
buf:array[1..100]of pansichar;
i:integer;
p:TParamThread;
begin
p:=PParamThread(s)^;
Finalize(PParamThread(S)^);
// FreeMem(S);
while True do
begin
sleep(1);
//csocket:=SockAccept(ServSocket,Pointer(@SocketAdrr),Pointer(@SocketAdrr));
i:=sizeof(SocketAdrr);
csocket:=accept(Result,Pointer(@SocketAdrr),pointer(i));
if csocket<>-1 then
begin
serverrecv(csocket,buf[1],sizeof(buf),0);
messagebox(0,PWideChar(buf[1]),PCHAR('Recv'),mb_ok);
end;
if csocket<> INVALID_SOCKET then
begin
closesocket(csocket); // закрываем сокет
end;
end;
end;
[/CODE]
Т.е. hThread:=BeginThread(nil, 0, Addr(TServerSock.SockWait), param, 0, threadID); Тут param получает значение номер сокета, а в функции function TServerSock.SockWait(s:pointer):DWORD;
s получается пустой. точнее какой то мусор наверное. тут p:=PParamThread(s)^; очень большое значение.
Что не так, уже сутки думаю....
Спасибо
Hole (2012-09-24 19:17:00) [1]
> Сергей М. © (24.09.12 15:12) [16]
Достойно ответил!
Сергей М. (2012-09-24 15:12:00) [2]
> Hole (24.09.12 00:13) [15]
И полны радости штаны ?)
> Гугл на профилактике?
Мне оно надо - по каждому чиху в гугле шариться ?
Понадобится мне - в три секунды выясню обо всех "нововведениях")
Hole (2012-09-24 00:13:00) [3]
> Сергей М. © (23.09.12 22:48) [13]
Оу! Надо же, голубой значок Мастера, я вначале даже внимания не обратил)
Hole (2012-09-24 00:09:00) [4]
> А что, для методов класса, статических методов класса, неявную
> передачу self-параметра уже упразднили ?
А что, Гугл на профилактике?)
http://docwiki.embarcadero.com/RADStudio/en/Methods#Class_Static_Methods
Сергей М. (2012-09-23 22:48:00) [5]
> она очень даже может быть методом класса, статическим методом
> класса
А что, для методов класса, статических методов класса, неявную передачу self-параметра уже упразднили ?
__ (2012-09-23 22:44:00) [6]> а откуда p взялось?
очепятка - нуно так:
FhServSocket:=Param^.hServSocket;
> надо же когда то учиться +
> почему тогда в классе приходит мусор?
-->
>>>Знать пришла пора разобраться в принципиальных различиях регулярной >>>процедуры и процедурного метода класса/объекта.
и тд и тп
Hole (2012-09-23 21:12:00) [7]
> MBo © (23.09.12 09:33) [3]
> Насчет поточной функции - она должна соответствовать прототипу,
> и в частности - не должна быть методом класса
Ну почему же, она очень даже может быть методом класса, статическим методом класса.
TThreadClass = class
class function ThreadFunc(Parameter: Pointer): Integer; static;
end;
Сергей М. (2012-09-23 19:12:00) [8]
> почему тогда в классе приходит мусор?
Знать пришла пора разобраться в принципиальных различиях регулярной процедуры и процедурного метода класса/объекта.
sniknik (2012-09-23 12:00:00) [9]> и что нет решения?
что есть "решение"? ... разработчиками метода написано, и описано (в справке) делать все определенным образом. "клиент" не читает справку и делает "по своему"... что будет решением? - "через Ж", скрестить "ежа с ужом"? - или "клиенту" переписать свое так как оно предполагалось разработчиками метода? - или взять другой метод более подходящий под "свой"?
sniknik (2012-09-23 11:52:00) [10]> а почему тогда в классе приходит мусор?
> она должна соответствовать прототипу
crossmark (2012-09-23 11:48:00) [11]процедуру вынес за пределы класса и все успешно передается... а почему тогда в классе приходит мусор? и что нет решения?
QAZ2 (2012-09-23 11:35:00) [12]
> crossmark (23.09.12 11:04) [4]
а почему нет?
весь интернет зас..н готовыми примерами сокет+поток в виде всяких "сканеров сети" и прочего подобного г..на
и все равно находятся "мыслители" которые даже готовый код не могут доделать под себя
crossmark (2012-09-23 11:06:00) [13]
> Вначале расскажите, зачем function TServerSock.SockWait(s:
> pointer):DWORD; функция и как долго она будет работать ?
тут больше вопрос уже стоит. как передать параметр.
а остальное отредактирую
> Чтобы дальше быстро поискать грабли в темном сарае - можно
> так:type TServerSock=classprivate FhServSocket:integer;
> ....FhServSocket:=p^.hServSocket; hThread:=BeginThread(nil,
> 0, Addr(TServerSock.SockWait), Ыуда, 0, threadID);..procedure
> TServerSock.SockWait;..csocket:=accept(FhServSocket,Pointer(@SocketAdrr),
> pointer(i));..З.Ы.crossmark, на данном этапе развития рекомендую
а откуда p взялось? и где ее объявить и чем?
> Вам воздержаться от использования потоков и сокетов в своих
> программах.
надо же когда то учиться
crossmark (2012-09-23 11:04:00) [14]
> да забей, не твое это, думать....пожалуйста
может быть. только не Вам судить
MBo (2012-09-23 09:33:00) [15]Насчет поточной функции - она должна соответствовать прототипу, и в частности - не должна быть методом класса
__ (2012-09-23 00:56:00) [16][1]++
> s получается пустой. точнее какой то мусор наверное
> Что не так, уже сутки думаю....
Вначале расскажите, зачем function TServerSock.SockWait(s:pointer):DWORD;функция и как долго она будет работать ?
Чтобы дальше быстро поискать грабли в темном сарае - можно так:
type TServerSock=class
private
FhServSocket:integer;
..
..
FhServSocket:=p^.hServSocket;
hThread:=BeginThread(nil, 0, Addr(TServerSock.SockWait), Ыуда, 0, threadID);
..
procedure TServerSock.SockWait;
..
csocket:=accept(FhServSocket,Pointer(@SocketAdrr),pointer(i));
..
З.Ы.
crossmark, на данном этапе развития рекомендую Вам воздержаться от использования потоков и сокетов в своих программах.
QAZ2 (2012-09-22 22:55:00) [17]
> уже сутки думаю....
да забей, не твое это, думать....
пожалуйста