![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
crossmark |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 28.4.2010 Репутация: нет Всего: нет |
Доброго времени!
Поставил цель побороться с WinSock. Но столкнулся с проблемой с потоками. Не получается в поток передать параметры. Подскажите что не так. Может из-за того что класс и память получается разная? Это лишь кусочек кода.
Т.е. hThread:=BeginThread(nil, 0, Addr(TServerSock.SockWait), param, 0, threadID); Тут param получает значение номер сокета, а в функции function TServerSock.SockWait(s:pointer):DWORD; s получается пустой. точнее какой то мусор наверное. тут p:=PParamThread(s)^; очень большое значение. Что не так, уже сутки думаю.... Спасибо |
|||
|
||||
DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: 2 Всего: 19 |
Что-то вы очень странное решили сделать, я как-то не понял... Одно мне понятно - у вас память портится.
Я так и не понял как и где вы берёте значение для S. Также, когда вы используете типизированный указатель, его и передавайте и его и используйте, потому что через указатель на запись вполне можно работать.
Но! так делать нельзя потому что у вас переменная передается как копия. Да и ещё для выделения памяти под типизированные указатели используются функции New, для освобождения Dispose. Я рекомендую вам сделать следующее: 1) Использовать встроенный класс TThread 2) Внутри класса TThread прописать все переменные которые вы хотите передать в качестве параметра 3) Создавать экземпляр потока спящим, потом инициализировать переменные(или перепишите конструктор, кому что нравится) 4) И только после этого запускать поток на выполнение Просто если честно я щас потерялся искать ошибку, да собственно как и вы сами ;) Да и внутри потока TThread вы свободно можете создавать класс TServerSock -------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." ![]() ![]() ![]() |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Все не так. Почитай где-нибудь про использование указателей в delphi.
Где выделение памяти для Param? Зачем передавать в BeginThread addr от TServerSock.SockWait? Зачем вообще пользоваться BeginThread? з.ы. и вообще код ужасен. -------------------- There are always someone smarter than you... |
|||
|
||||
crossmark |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 28.4.2010 Репутация: нет Всего: нет |
память я выделял вот так:
Добавлено через 5 минут и 16 секунд
а что надо передать чтобы запустить этот метод? вопрос конечно в другом, может быть так нельзя. а с другой стороны вроде удобно, есть метод, то почему его не выполнить в потоке.....
хочется испытать...
что тут ужасного? хочется узнать и исправиться |
||||||||
|
|||||||||
crossmark |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 28.4.2010 Репутация: нет Всего: нет |
процедуру вынес за пределы класса и все успешно передается... а почему тогда в классе приходит мусор? и что нет решения?
|
|||
|
||||
DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: 2 Всего: 19 |
Да, нельзя. Учитывая что вы передали ссылку на метод класса, объект которого не создан. К чему это приводит вы уже видели. Ну собственно испытали ![]() Как минимум то, что у вас запись бессмысленная для хранения одного поля. Да и в целом читабельность кода весьма низкая. Кстати, использование глобальных переменных и потоков очень вредно. -------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." ![]() ![]() ![]() |
|||
|
||||
MetalFan |
|
||||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Потому, что
Есть решение - использовать класс TThread. А почему этой части нет в коде, приведенном в первом сообщении? Все ужасно, от форматирования кода до самого кода. Почитай книжки по делфе, полистай исходные коды VCL. Ну и прислушайся к советам DarkProg. -------------------- There are always someone smarter than you... |
||||
|
|||||
crossmark |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 28.4.2010 Репутация: нет Всего: нет |
Спасибо!
я то конечно прислушиваюсь. и не спорю. Правда очень обидно критикой. И обидно что все-таки не понял... про содержание и оформление. говорите, почитай книги. читал книги. может мне попадаются все книги в которых пишут одно и тоже. как в интернете все однотипное. и материал излагается двумя тремя строками кода. зато что-то простое распишут на три листа. а более менее сложное и интересно типа что есть такое...и можно так применять. какую можно хорошую книгу почитать? дайте совет! есть стремление и желание... помогите.! ведь асами и вы не сразу стали. |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Вообще, считаю, что книгу достаточно почитать по базовым вещам. Типа синтаксис языка, основные конструкции и т.п. А учиться уже можно, решая какую-либо практическую задачу, читать хелп и изучать исходники VCL и чужие исходники. -------------------- There are always someone smarter than you... |
|||
|
||||
DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: 2 Всего: 19 |
А сложно сказать, у меня на полке вон и Фаронова книжки стоят и Сухарева есть, и по другим языкам есть... И вот даже сугубо философско-программисткая Роберта Мартина "Чистый код" есть. Пока не начнёте решать сложные реальные задачи прогресса будет не много, потому что теория-теорией, а понимание её придёт только с практикой, а практику могут дать только серьёзные проекты. Я вот программирую уже 8 лет примерно, а настоящим программистом себя считаю только последние 1,5 года, потому что стал решать действительно сложные задачи(ну работа у меня такая ![]() Соглашусь, исходники VCL в целом полезны, как и чужие исходники, но не все исходники одинаково полезны. Хотя некоторые исходники VCL я счита шедевральными, хотя не всегда понимаю принятую парадигму которую используют разработчики до конца. Добавлено через 3 минуты и 34 секунды Ну простой пример, SockWait - понятно что что-то там ждёт сокет или это сокет ждут, или это функция для обработки сокета которые стоит в некоторой очереди, что это, ни комментариев, ни понятности названия метода... что это такое... Ну и как бы надо придерживаться единых правил оформления, читать код который оформлен по разному в пределах одной функции весьма тяжело, а оформление должно быть одинаковым на всём протяжении проекта. -------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." ![]() ![]() ![]() |
|||
|
||||
crossmark |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 28.4.2010 Репутация: нет Всего: нет |
не много понятно стало
![]() просто когда застопорился, пришлось уже подбирать варианты. и копаться почему не работает. спасибо! Это сообщение отредактировал(а) crossmark - 23.9.2012, 18:16 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |