Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CreateThread and winSock [D7, Win2k, WinXP]


Страницы:   1 2

Тихан Петрович ©   (2004-08-08 13:05:00) 

Господа :) У меня такой вопрос, да нет, наверное даже просьба...
В целом знаком с использованием сокетов в дельфи, но вяло так вяленько.. =) совсем, всё времени не хватает на то, что бы полностью заняться этим вопросом.
И вот полностью не разобравшись с этим вопросом передо мной предстаёт задача написать многопоточный TCPIP клиент. В его задачи просто входит коннект к web-серверу отправка GET/POST анализ принятого ну и прочая ерунда :)

Ну и я подумав про себя "ерунда" взялся за это дело. Но не тут-то было, всё у меня не как у людей, всё у меня тормозит и виснит, TThread раздражает тем, что как я понимаю, максимальное количисто запущенных потоков 255 (я прав?) а надо больше.
Свой код даже приводить не буду, т.к. там сплошная ерунда, такую ерунду вы господа можете мысленно в голове быстренько накатать :) Код состоит так:
класс TswebSock - просто класс, в котором и производится коннект к серваку и принятие ответов.
класс TzwebSock - наследник TThread в котром присутствовал TswebSock и всё это работало в потоках, но потоков до 255 и всё подвисает. Я больше так не могу.. не могу! помогите!
И вот как мне победить разграничение в 255 потоков? Я думаю может winapi CreateThread?
Я не думаю, что будет слишком проблемно для вас написать простой пример взаимодействия winsock (сделайте для примера мне правельный коннект к серверу и отправку строки) и CreateThread (более 255 потоков) и всё это нормально работающее.
Я не прошу чего-то огромного, а сможете - ну слов у меня не будет, буду прыгать до потолка.

Надеюсь на Вас. Спасибо!


Тихан Петрович   (2004-08-10 17:05:00) [1]


> > А как читаешь?

тфу .. считаешь.
------------------
ну на примере tclientsocket. Так благодарность в стихах буду писать :)


Digitman   (2004-08-10 15:53:00) [2]


> А как читаешь?


чаще, вообще-то глазами


> только словами... но зато какими


угу ...за тобой - дифирамбы в мою честь)... весьма желательно - в стихотворной форме)


> реально хорошим примером


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

единственное, что могу наперед сказать - для реализации асинхр.режима при иниц-ции гнезда тебе следует использовать одну из ф-ций WSAAsyncSelect, WSAEventselect .. подродности - в http://book.itep.ru, раздел "WinSock"


Тихан Петрович   (2004-08-10 15:24:00) [3]

хорошо обьяснил. Но я бы наверное совсем отстал со своими вопросами, если бы ты подкрепил реально хорошимпримером. А как читаешь? :) Отблагодорить к сожалению могу только словами... но зато какими..!


Digitman   (2004-08-10 13:42:00) [4]


> "своего" класса с винсоком внутри


хоть "своего", хоть не "своего", но ничто не мешает использовать неблок.режим гнезда, создаваемого этим классом, с задействованием механизма асинхр.нотификаций

пусть осн.трэд послал у тебя GET-запрос №1 через гнездо 1.
пока запрос исполняется сервером, осн.трэд свободен и вполне в состоянии послать другой GET-запрос №2 через гнездо 2..
как только сервер ответит на GET-запрос №1, гнездо 1 возбудит событие FD_READ, в обработчике которого рез-т запроса считывается осн.трэдом из гнезда 1, и если рез-т запроса принят целиком, гнездо 1 считается "свободным", и осн.трэд посылает уже GET-запрос №3 через гнездо 1 .. А когда сервер ответит на GET-запрос №2, уже гнездо 2 возбудит FD_READ, осн.поток прочитает рез-т запроса из гнезда 2 и запустит через "освободившееся" гнездо 2 уже GET-запрос №4 ... и так далее ..

т.е. в дан.случае ты обошелся всего 2-мя гнездами и одним трэдом для 4-х запросов, справедливо полагаясь на факт, что разные запросы обрабатываются разными серверами по-разному, с разным временем реакции на посланные запросы и, соответственно, с разным временем возврата рез-тов этих запросов .. именно заведомая неодновременность выполнения разных запросов и получения их рез-тов дает возможность реализации т.н. "пула"  гнезд, обходясь сравнительно небольшим их количеством

"напичкать" же свой процесс огромной кучей доп.трэдов и гнезд - попросту ничем не оправданная блажь


Тихан Петрович   (2004-08-10 12:52:00) [5]

Привет!
Я наверное тупею с каждым днём ;)
т.е. ты говоришь мне например вначале создать допустим 10 tclientsocket и потом по мере прихождения ответов на них создавать другие.. но это как-то интересно.... я говорю у меня канал и комп спокойно выдержат наверное до 1000 (но оптимальнее всего ~500), выдержат но не одновременное создание tclientsocket а именно "своего" класса с винсоком внутри.

блин, запутался...


Digitman   (2004-08-10 12:30:00) [6]

создай пул из ограниченного небольшого числа трэдов
стартуй в них первую "порцию" запросов
по мере исполнения очер.запроса (т.е. приема ожидаемого результата) в очер.треде трэд считается освободившимся и реинициализируется для выполнения очер.запроса


Тихан Петрович   (2004-08-10 08:19:00) [7]

блин, слуш. я не понимаю, мнеж нужно как можно больше сделать запросов в сеть, так как мне их не стартовать в таком кол-ве?


Digitman   (2004-08-09 17:36:00) [8]


> потоков получится мало, тут речи о 500-600 не пойдёт. Т.к.
> систему будет тормозить по страшному. Не знаю почему %)


ну и нефига их стартовать (в таком кол-ве) !

у тебя есь событие OnRead - его и рассматривай в лупу


Тихан Петрович   (2004-08-09 17:29:00) [9]

короче говоря так. под потоками у меня подразумевается многое, в частности потоки = нити = кол-во одновременно запущенного чего-то.

и вот, если я буду создавать много TClientSocket, то потоков получится мало, тут речи о 500-600 не пойдёт. Т.к. систему будет тормозить по страшному. Не знаю почему %)
А вот если создать класс наследник TThread и потом

var sthreadarray = array [0..255] of Tzwebsock;
begin
for i := 0 to procount do begin
sthreadarray[i]:=Tzwebsock.Create(false);
//..........
//ну а потом на Tzwebsock.Execute вешаем многое 8)
//весь код приводить смысла не вижу.

то спокойно могу до 255 потоков, можно установить и больше, но работать будут только 255. Работает всё это с тормозами в частности от моей безграмотности.


Digitman   (2004-08-09 15:51:00) [10]


> и создать можно большее кол-во "потоков".


лыко-мочало - начинай сначала) ..

еще раз задаю вопрос - ЗАЧЕМ ? Зачем тебе "больше потоков" ? Чем ты можешь аргументировать необходимость наращивания их числа ?


Тихан Петрович   (2004-08-09 15:28:00) [11]

пасиб, я посмотрю.
но у меня ещё одно такое моё заблуждение...
мне кажется, что если я буду использовать только винсок, то системные ресурсы жрать будет меньше и создать можно большее кол-во "потоков". Как считашь?


Digitman   (2004-08-09 14:51:00) [12]

создай столько TClientSocket-объектов, сколько нужно для старта одновр.закачек ... установи ClientType = ctNonBlocking для каждого, стартуй коннект каждого объекта для своего сервера ..
пока я не вижу аргументов в пользу WinSockAPI ..


Тихан Петрович   (2004-08-09 14:40:00) [13]

всё. сдаюсь. я полный кретин. (наверное, уверен на 99%).

вопрос.
как ты мне предлагаешь сделать максимальное количество запросов в сеть и ответов. Нужно запустить много "операций" одновресенно. Ну т.е. tcpip get/post, я уже вверху писал.
Может и треды тут не нужны, но мне в голову ничего другого не пришло. Я дурак?


Digitman   (2004-08-09 14:32:00) [14]


> оффтоп "насандалить" -- чес слово порадовал


а ты думал !!


> для того, что бы сделать максимальное кол-во производительности


где ты эту чушь почерпнул, что наращивание числа трэдов ведет увеличению производительности ?


Тихан Петрович   (2004-08-09 14:00:00) [15]

оффтоп "насандалить" -- чес слово порадовал :)
ну для того, что бы сделать максимальное кол-во производительности.


Digitman   (2004-08-09 13:56:00) [16]


> про кол-во тредов не доходит до меня. Тупой я наверное.
> Обьясни ещё раз, если можешь


нет  уж... это ты будь любезен объяснить, какими соображениями ты руководствовался при принятии решения насандалить туеву хучу трэдов ... чем-то ты все-таки, наверно, руководствовался ?


Тихан Петрович   (2004-08-09 13:49:00) [17]

а это идея. Я с мозгами конечно поговорю. Но чё-то про кол-во тредов не доходит до меня. Тупой я наверное. Обьясни ещё раз, если можешь. Тупой я...


Digitman   (2004-08-09 13:07:00) [18]


> чего я понять не могу, так это своих тупых мозгов,


задай вопрос своим "тупым мозгам", ЗАЧЕМ им столько трэдов
задай им так же вопрос, в курсе ли они , что в WinSock существует асинхронный режим работы гнезд


Тихан Петрович   (2004-08-09 12:54:00) [19]

нее, ну например представь, что мне нужно просто накрутить банеров (мне не это нужно! не предлягайте готовые решения) ну и чего.. допустим у меня широкий канал, хороший комп, вполне прокатит 500-600 потоков отправляется данных не много принимается и того наверное меньше. Единственное, чего я понять не могу, так это своих тупых мозгов, которые не варят в этом напрвлении :( некжто примера не дадите?


Digitman   (2004-08-09 09:45:00) [20]


> Тихан Петрович   (09.08.04 09:39) [4]


а на кой шут тогда столько трэдов ?
ты что, всерьез считаешь, что задача одновременной закачки множества ресурсов решается искл-но наращиванием числа кодовых потоков ? да глупости это !


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо