Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> странный поток, передача данных в поток 
:(
    Опции темы
crossmark
Дата 22.9.2012, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 28.4.2010

Репутация: нет
Всего: нет



Доброго  времени!
Поставил цель побороться с 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(s:pointer):DWORD;
s получается пустой. точнее какой то мусор наверное. тут p:=PParamThread(s)^; очень большое значение.
Что не так, уже сутки думаю....
Спасибо
PM MAIL   Вверх
DarkProg
Дата 22.9.2012, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 2
Всего: 19



Что-то вы очень странное решили сделать, я как-то не понял... Одно мне понятно - у вас память портится.

Я так и не понял как и где вы берёте значение для S.

Также, когда вы используете типизированный указатель, его и передавайте и его и используйте, потому что через указатель на запись вполне можно работать.
Код

    p:PParamThread; //вот так
begin
   p:=PParamThread(s);
   [S]Finalize(PParamThread(S)^);[/S] Dispose(S);

Но! так делать нельзя потому что у вас переменная передается как копия.
Да и ещё для выделения памяти под типизированные указатели используются функции New, для освобождения Dispose.

Я рекомендую вам сделать следующее:
1) Использовать встроенный класс TThread
2) Внутри класса TThread прописать все переменные которые вы хотите передать в качестве параметра
3) Создавать экземпляр потока спящим, потом инициализировать переменные(или перепишите конструктор, кому что нравится)
4) И только после этого запускать поток на выполнение
Просто если честно я щас потерялся искать ошибку, да собственно как и вы сами ;)
Да и внутри потока TThread вы свободно можете создавать класс TServerSock


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
MetalFan
Дата 22.9.2012, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Все не так. Почитай где-нибудь про использование указателей в delphi.
Где выделение памяти для Param?
Зачем передавать в BeginThread addr от TServerSock.SockWait?
Зачем вообще пользоваться BeginThread?

з.ы. и вообще код ужасен.




--------------------
There are always someone smarter than you...
PM MAIL   Вверх
crossmark
Дата 23.9.2012, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 28.4.2010

Репутация: нет
Всего: нет



память я выделял вот так:
Код

   Param:=AllocMem(SizeOf(TParamThread));
   Param.hServSocket:=ServSocket;


Добавлено через 5 минут и 16 секунд

Цитата

Зачем передавать в BeginThread addr от TServerSock.SockWait?

а что надо передать чтобы запустить этот метод?
вопрос конечно в другом, может быть так нельзя. а с другой стороны вроде удобно, есть метод, то почему его не выполнить в потоке.....
 
Цитата

Зачем вообще пользоваться BeginThread? 

хочется испытать...

Цитата

з.ы. и вообще код ужасен.

что тут ужасного? хочется узнать и исправиться
PM MAIL   Вверх
crossmark
Дата 23.9.2012, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 28.4.2010

Репутация: нет
Всего: нет



процедуру вынес за пределы класса и все успешно передается... а почему тогда в классе приходит мусор? и что нет решения?
PM MAIL   Вверх
DarkProg
Дата 23.9.2012, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 2
Всего: 19



Цитата(crossmark @  23.9.2012,  10:58 Найти цитируемый пост)
а что надо передать чтобы запустить этот метод?
вопрос конечно в другом, может быть так нельзя. а с другой стороны вроде удобно, есть метод, то почему его не выполнить в потоке.....

Да, нельзя. Учитывая что вы передали ссылку на метод класса, объект которого не создан. К чему это приводит вы уже видели.

Цитата(crossmark @  23.9.2012,  10:58 Найти цитируемый пост)
хочется испытать...

Ну собственно испытали  smile  Теперь можно и по нормальному сделать.

Цитата(crossmark @  23.9.2012,  10:58 Найти цитируемый пост)
что тут ужасного? хочется узнать и исправиться 

Как минимум то, что у вас запись бессмысленная для хранения одного поля. Да и в целом читабельность кода весьма низкая.
Кстати, использование глобальных переменных и потоков очень вредно.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
MetalFan
Дата 23.9.2012, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(crossmark @  23.9.2012,  10:49 Найти цитируемый пост)
процедуру вынес за пределы класса и все успешно передается... а почему тогда в классе приходит мусор?

Потому, что
Код

TThreadFunc = function(Parameter: Pointer): Integer;


Цитата(crossmark @  23.9.2012,  10:49 Найти цитируемый пост)
и что нет решения? 

Есть решение - использовать класс TThread.

Цитата(crossmark @  23.9.2012,  09:58 Найти цитируемый пост)
память я выделял вот так:

А почему этой части нет в коде, приведенном в первом сообщении?

Цитата(crossmark @  23.9.2012,  09:58 Найти цитируемый пост)
что тут ужасного? хочется узнать и исправиться 

Все ужасно, от форматирования кода до самого кода.
Почитай книжки по делфе, полистай исходные коды VCL.

Ну и прислушайся к советам DarkProg.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
crossmark
Дата 23.9.2012, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 28.4.2010

Репутация: нет
Всего: нет



Спасибо!
я то конечно прислушиваюсь. и не спорю. Правда очень обидно критикой. И обидно что все-таки не понял... про содержание и оформление.
говорите, почитай книги. читал книги. может мне попадаются все книги в которых пишут одно и тоже. как в интернете все однотипное. и материал излагается двумя тремя строками кода.
зато что-то простое распишут на три листа. а более менее сложное и интересно типа что есть такое...и можно так применять.

какую можно хорошую книгу почитать? дайте совет! есть стремление и желание... помогите.! ведь асами и вы не сразу стали. 
PM MAIL   Вверх
MetalFan
Дата 23.9.2012, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(crossmark @  23.9.2012,  16:06 Найти цитируемый пост)
какую можно хорошую книгу почитать?

Вообще, считаю, что книгу достаточно почитать по базовым вещам. Типа синтаксис языка, основные конструкции и т.п.
А учиться уже можно, решая какую-либо практическую задачу, читать хелп и изучать исходники VCL и чужие исходники.



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
DarkProg
Дата 23.9.2012, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 2
Всего: 19



Цитата(crossmark @  23.9.2012,  17:06 Найти цитируемый пост)
какую можно хорошую книгу почитать? дайте совет! есть стремление и желание... помогите.! ведь асами и вы не сразу стали.

А сложно сказать, у меня на полке вон и Фаронова книжки стоят и Сухарева есть, и по другим языкам есть... И вот даже сугубо философско-программисткая Роберта Мартина "Чистый код" есть.
Пока не начнёте решать сложные реальные задачи прогресса будет не много, потому что теория-теорией, а понимание её придёт только с практикой, а практику могут дать только серьёзные проекты.

Я вот программирую уже 8 лет примерно, а настоящим программистом себя считаю только последние 1,5 года, потому что стал решать действительно сложные задачи(ну работа у меня такая smile), и пока я не стал решать реальные практические задачи, сопровождать проекты, и расширять их функционал в геометрической прогрессии, я не понимал много из теории, а пришла практика, начал использовать теорию и начал понимать(но опять же не всё и не всегда, посему и сам спрашиваю).

Цитата(MetalFan @  23.9.2012,  17:54 Найти цитируемый пост)
 изучать исходники VCL и чужие исходники

Соглашусь, исходники VCL в целом полезны, как и чужие исходники, но не все исходники одинаково полезны. Хотя некоторые исходники VCL я счита шедевральными, хотя не всегда понимаю принятую парадигму которую используют разработчики до конца.

Добавлено через 3 минуты и 34 секунды
Цитата(crossmark @  23.9.2012,  17:06 Найти цитируемый пост)
И обидно что все-таки не понял... про содержание и оформление

Ну простой пример, SockWait - понятно что что-то там ждёт сокет или это сокет ждут, или это функция для обработки сокета которые стоит в некоторой очереди, что это, ни комментариев, ни понятности названия метода... что это такое...
Ну и как бы надо придерживаться единых правил оформления, читать код который оформлен по разному в пределах одной функции весьма тяжело, а оформление должно быть одинаковым на всём протяжении проекта.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
crossmark
Дата 23.9.2012, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 28.4.2010

Репутация: нет
Всего: нет



не много понятно  стало smile
просто когда застопорился, пришлось уже подбирать варианты. и копаться почему не работает. 
спасибо! 

Это сообщение отредактировал(а) crossmark - 23.9.2012, 18:16
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0835 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.