Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.02.26;
Скачать: CL | DM;

Вниз

странный поток   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.005 c
15-1458477503
MsGuns
2016-03-20 15:38
2017.02.26
Excel->MS SQL Server


15-1458595804
Юрий
2016-03-22 00:30
2017.02.26
С днем рождения ! 22 марта 2016 вторник


1-1348336174
crossmark
2012-09-22 21:49
2017.02.26
странный поток


2-1434709662
Дмитрий
2015-06-19 13:27
2017.02.26
обмен приложения с сервером mySQL


1-1348498746
jacksotnik
2012-09-24 18:59
2017.02.26
Вопрос по fastreport