|
#1
|
|||
|
|||
странный поток
Доброго времени!
Поставил цель побороться с WinSock. Но столкнулся с проблемой с потоками. Не получается в поток передать параметры. Подскажите что не так. Может из-за того что класс и память получается разная? Это лишь кусочек кода. Код:
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; Т.е. hThread:=BeginThread(nil, 0, Addr(TServerSock.SockWait), param, 0, threadID); Тут param получает значение номер сокета, а в функции function TServerSock.SockWait(sointer)WORD; s получается пустой. точнее какой то мусор наверное. тут p:=PParamThread(s)^; очень большое значение. Что не так, уже сутки думаю.... Спасибо |
#2
|
||||
|
||||
Цитата:
Код:
hThread:=BeginThread(nil, 0, Addr(TServerSock.SockWait), Addr(cardinal(param)), 0, threadID) Цитата:
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard |
#3
|
|||
|
|||
Кроме того, третим параметром BeginThread должен быть указатель на свободную функцию, а у Вас указатель на метод.
В результате получается каша. Метод SockWait ждёт, что ему будет передан указатель на объект типа TServerSock, а этого не происходит. |
#4
|
|||
|
|||
спасибо получилось
|