Форум: "Сети";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
ВнизCreateThread and winSock Найти похожие ветки
← →
Тихан Петрович (2004-08-08 13:05) [0]Господа :) У меня такой вопрос, да нет, наверное даже просьба...
В целом знаком с использованием сокетов в дельфи, но вяло так вяленько.. =) совсем, всё времени не хватает на то, что бы полностью заняться этим вопросом.
И вот полностью не разобравшись с этим вопросом передо мной предстаёт задача написать многопоточный TCPIP клиент. В его задачи просто входит коннект к web-серверу отправка GET/POST анализ принятого ну и прочая ерунда :)
Ну и я подумав про себя "ерунда" взялся за это дело. Но не тут-то было, всё у меня не как у людей, всё у меня тормозит и виснит, TThread раздражает тем, что как я понимаю, максимальное количисто запущенных потоков 255 (я прав?) а надо больше.
Свой код даже приводить не буду, т.к. там сплошная ерунда, такую ерунду вы господа можете мысленно в голове быстренько накатать :) Код состоит так:
класс TswebSock - просто класс, в котором и производится коннект к серваку и принятие ответов.
класс TzwebSock - наследник TThread в котром присутствовал TswebSock и всё это работало в потоках, но потоков до 255 и всё подвисает. Я больше так не могу.. не могу! помогите!
И вот как мне победить разграничение в 255 потоков? Я думаю может winapi CreateThread?
Я не думаю, что будет слишком проблемно для вас написать простой пример взаимодействия winsock (сделайте для примера мне правельный коннект к серверу и отправку строки) и CreateThread (более 255 потоков) и всё это нормально работающее.
Я не прошу чего-то огромного, а сможете - ну слов у меня не будет, буду прыгать до потолка.
Надеюсь на Вас. Спасибо!
← →
Verg © (2004-08-08 13:24) [1]C:\Program Files\Borland\Delphi(6)(7)\Source\Vcl\ScktComp.pas
TServerSocket в режиме stThreadBlocking.
Потоков у процесса может быть столько, сколько позволяют системные ресурсы, предоставленные этому процессу.
Т.е. можно и 10-тю потоками забить процесс под "самую тубетэйку" :), если эти потоки, каждый, будут просить по-многу.
← →
Тихан Петрович (2004-08-08 16:58) [2]пасибо конечно :) но нужно именно на винсокете, не используя дополнительный фиговины :)
← →
Digitman © (2004-08-09 08:14) [3]
> Тихан Петрович (08.08.04 16:58) [2]
> нужно именно на винсокете, не используя дополнительный фиговины
>
спамом занимаемся ?
← →
Тихан Петрович (2004-08-09 09:39) [4]неее.. ну кто такое сказал? и почему винсокет именно для спама? а? от уж не знал =) лучше реально с моей проблемой помогите.!
← →
Digitman © (2004-08-09 09:45) [5]
> Тихан Петрович (09.08.04 09:39) [4]
а на кой шут тогда столько трэдов ?
ты что, всерьез считаешь, что задача одновременной закачки множества ресурсов решается искл-но наращиванием числа кодовых потоков ? да глупости это !
← →
Тихан Петрович (2004-08-09 12:54) [6]нее, ну например представь, что мне нужно просто накрутить банеров (мне не это нужно! не предлягайте готовые решения) ну и чего.. допустим у меня широкий канал, хороший комп, вполне прокатит 500-600 потоков отправляется данных не много принимается и того наверное меньше. Единственное, чего я понять не могу, так это своих тупых мозгов, которые не варят в этом напрвлении :( некжто примера не дадите?
← →
Digitman © (2004-08-09 13:07) [7]
> чего я понять не могу, так это своих тупых мозгов,
задай вопрос своим "тупым мозгам", ЗАЧЕМ им столько трэдов
задай им так же вопрос, в курсе ли они , что в WinSock существует асинхронный режим работы гнезд
← →
Тихан Петрович (2004-08-09 13:49) [8]а это идея. Я с мозгами конечно поговорю. Но чё-то про кол-во тредов не доходит до меня. Тупой я наверное. Обьясни ещё раз, если можешь. Тупой я...
← →
Digitman © (2004-08-09 13:56) [9]
> про кол-во тредов не доходит до меня. Тупой я наверное.
> Обьясни ещё раз, если можешь
нет уж... это ты будь любезен объяснить, какими соображениями ты руководствовался при принятии решения насандалить туеву хучу трэдов ... чем-то ты все-таки, наверно, руководствовался ?
← →
Тихан Петрович (2004-08-09 14:00) [10]оффтоп "насандалить" -- чес слово порадовал :)
ну для того, что бы сделать максимальное кол-во производительности.
← →
Digitman © (2004-08-09 14:32) [11]
> оффтоп "насандалить" -- чес слово порадовал
а ты думал !!
> для того, что бы сделать максимальное кол-во производительности
где ты эту чушь почерпнул, что наращивание числа трэдов ведет увеличению производительности ?
← →
Тихан Петрович (2004-08-09 14:40) [12]всё. сдаюсь. я полный кретин. (наверное, уверен на 99%).
вопрос.
как ты мне предлагаешь сделать максимальное количество запросов в сеть и ответов. Нужно запустить много "операций" одновресенно. Ну т.е. tcpip get/post, я уже вверху писал.
Может и треды тут не нужны, но мне в голову ничего другого не пришло. Я дурак?
← →
Digitman © (2004-08-09 14:51) [13]создай столько TClientSocket-объектов, сколько нужно для старта одновр.закачек ... установи ClientType = ctNonBlocking для каждого, стартуй коннект каждого объекта для своего сервера ..
пока я не вижу аргументов в пользу WinSockAPI ..
← →
Тихан Петрович (2004-08-09 15:28) [14]пасиб, я посмотрю.
но у меня ещё одно такое моё заблуждение...
мне кажется, что если я буду использовать только винсок, то системные ресурсы жрать будет меньше и создать можно большее кол-во "потоков". Как считашь?
← →
Digitman © (2004-08-09 15:51) [15]
> и создать можно большее кол-во "потоков".
лыко-мочало - начинай сначала) ..
еще раз задаю вопрос - ЗАЧЕМ ? Зачем тебе "больше потоков" ? Чем ты можешь аргументировать необходимость наращивания их числа ?
← →
Тихан Петрович (2004-08-09 17:29) [16]короче говоря так. под потоками у меня подразумевается многое, в частности потоки = нити = кол-во одновременно запущенного чего-то.
и вот, если я буду создавать много 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 17:36) [17]
> потоков получится мало, тут речи о 500-600 не пойдёт. Т.к.
> систему будет тормозить по страшному. Не знаю почему %)
ну и нефига их стартовать (в таком кол-ве) !
у тебя есь событие OnRead - его и рассматривай в лупу
← →
Тихан Петрович (2004-08-10 08:19) [18]блин, слуш. я не понимаю, мнеж нужно как можно больше сделать запросов в сеть, так как мне их не стартовать в таком кол-ве?
← →
Digitman © (2004-08-10 12:30) [19]создай пул из ограниченного небольшого числа трэдов
стартуй в них первую "порцию" запросов
по мере исполнения очер.запроса (т.е. приема ожидаемого результата) в очер.треде трэд считается освободившимся и реинициализируется для выполнения очер.запроса
← →
Тихан Петрович (2004-08-10 12:52) [20]Привет!
Я наверное тупею с каждым днём ;)
т.е. ты говоришь мне например вначале создать допустим 10 tclientsocket и потом по мере прихождения ответов на них создавать другие.. но это как-то интересно.... я говорю у меня канал и комп спокойно выдержат наверное до 1000 (но оптимальнее всего ~500), выдержат но не одновременное создание tclientsocket а именно "своего" класса с винсоком внутри.
блин, запутался...
← →
Digitman © (2004-08-10 13:42) [21]
> "своего" класса с винсоком внутри
хоть "своего", хоть не "своего", но ничто не мешает использовать неблок.режим гнезда, создаваемого этим классом, с задействованием механизма асинхр.нотификаций
пусть осн.трэд послал у тебя 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 15:24) [22]хорошо обьяснил. Но я бы наверное совсем отстал со своими вопросами, если бы ты подкрепил реально хорошим примером. А как читаешь? :) Отблагодорить к сожалению могу только словами... но зато какими..!
← →
Digitman © (2004-08-10 15:53) [23]
> А как читаешь?
чаще, вообще-то глазами
> только словами... но зато какими
угу ...за тобой - дифирамбы в мою честь)... весьма желательно - в стихотворной форме)
> реально хорошим примером
и на базе чего, спрашивается, я должен пример тебе приводить ? ты же свой класс решил писать ? мне почем знать, что ты там понаворочаешь и как будет выглядеть класс ?
единственное, что могу наперед сказать - для реализации асинхр.режима при иниц-ции гнезда тебе следует использовать одну из ф-ций WSAAsyncSelect, WSAEventselect .. подродности - в http://book.itep.ru, раздел "WinSock"
← →
Тихан Петрович (2004-08-10 17:05) [24]
> > А как читаешь?
тфу .. считаешь.
------------------
ну на примере tclientsocket. Так благодарность в стихах буду писать :)
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.04 c