![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CreateThread and winSock [D7, Win2k, WinXP]
Тихан Петрович © (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]
а на кой шут тогда столько трэдов ?
ты что, всерьез считаешь, что задача одновременной закачки множества ресурсов решается искл-но наращиванием числа кодовых потоков ? да глупости это !