Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1435144825
shadow
2015-06-24 14:20
2017.02.26
RichEdit: Загрузка из rtf-файла только текста


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


2-1434957180
Djonik
2015-06-22 10:13
2017.02.26
idhttp json - авторизация qiwi


15-1458564457
ttUser
2016-03-21 15:47
2017.02.26
Как сделать, чтобы TTouchKeyboard не получала фокус


15-1458477503
MsGuns
2016-03-20 15:38
2017.02.26
Excel->MS SQL Server





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский