Форум: "Основная";
Текущий архив: 2017.02.26;
Скачать: [xml.tar.bz2];
Внизстранный поток Найти похожие ветки
← →
crossmark (2012-09-22 21:49) [0]Доброго времени!
Поставил цель побороться с 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)^; очень большое значение.
Что не так, уже сутки думаю....
Спасибо
← →
QAZ2 (2012-09-22 22:55) [1]
> уже сутки думаю....
да забей, не твое это, думать....
пожалуйста
← →
__ (2012-09-23 00:56) [2][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, на данном этапе развития рекомендую Вам воздержаться от использования потоков и сокетов в своих программах.
← →
MBo © (2012-09-23 09:33) [3]Насчет поточной функции - она должна соответствовать прототипу, и в частности - не должна быть методом класса
← →
crossmark (2012-09-23 11:04) [4]
> да забей, не твое это, думать....пожалуйста
может быть. только не Вам судить
← →
crossmark (2012-09-23 11:06) [5]
> Вначале расскажите, зачем 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 взялось? и где ее объявить и чем?
> Вам воздержаться от использования потоков и сокетов в своих
> программах.
надо же когда то учиться
← →
QAZ2 (2012-09-23 11:35) [6]
> crossmark (23.09.12 11:04) [4]
а почему нет?
весь интернет зас..н готовыми примерами сокет+поток в виде всяких "сканеров сети" и прочего подобного г..на
и все равно находятся "мыслители" которые даже готовый код не могут доделать под себя
← →
crossmark (2012-09-23 11:48) [7]процедуру вынес за пределы класса и все успешно передается... а почему тогда в классе приходит мусор? и что нет решения?
← →
sniknik © (2012-09-23 11:52) [8]> а почему тогда в классе приходит мусор?
> она должна соответствовать прототипу
← →
sniknik © (2012-09-23 12:00) [9]> и что нет решения?
что есть "решение"? ... разработчиками метода написано, и описано (в справке) делать все определенным образом. "клиент" не читает справку и делает "по своему"... что будет решением? - "через Ж", скрестить "ежа с ужом"? - или "клиенту" переписать свое так как оно предполагалось разработчиками метода? - или взять другой метод более подходящий под "свой"?
← →
Сергей М. © (2012-09-23 19:12) [10]
> почему тогда в классе приходит мусор?
Знать пришла пора разобраться в принципиальных различиях регулярной процедуры и процедурного метода класса/объекта.
← →
Hole (2012-09-23 21:12) [11]
> MBo © (23.09.12 09:33) [3]
> Насчет поточной функции - она должна соответствовать прототипу,
> и в частности - не должна быть методом класса
Ну почему же, она очень даже может быть методом класса, статическим методом класса.
TThreadClass = class
class function ThreadFunc(Parameter: Pointer): Integer; static;
end;
← →
__ (2012-09-23 22:44) [12]> а откуда p взялось?
очепятка - нуно так:FhServSocket:=Param^.hServSocket;
> надо же когда то учиться +
> почему тогда в классе приходит мусор?
-->
>>>Знать пришла пора разобраться в принципиальных различиях регулярной >>>процедуры и процедурного метода класса/объекта.
и тд и тп
← →
Сергей М. © (2012-09-23 22:48) [13]
> она очень даже может быть методом класса, статическим методом
> класса
А что, для методов класса, статических методов класса, неявную передачу self-параметра уже упразднили ?
← →
Hole (2012-09-24 00:09) [14]
> А что, для методов класса, статических методов класса, неявную
> передачу self-параметра уже упразднили ?
А что, Гугл на профилактике?)
http://docwiki.embarcadero.com/RADStudio/en/Methods#Class_Static_Methods
← →
Hole (2012-09-24 00:13) [15]
> Сергей М. © (23.09.12 22:48) [13]
Оу! Надо же, голубой значок Мастера, я вначале даже внимания не обратил)
← →
Сергей М. © (2012-09-24 15:12) [16]
> Hole (24.09.12 00:13) [15]
И полны радости штаны ?)
> Гугл на профилактике?
Мне оно надо - по каждому чиху в гугле шариться ?
Понадобится мне - в три секунды выясню обо всех "нововведениях")
← →
Hole (2012-09-24 19:17) [17]
> Сергей М. © (24.09.12 15:12) [16]
Достойно ответил!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2017.02.26;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.002 c