Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.036 c
14-1096555117
X9
2004-09-30 18:38
2004.10.17
Помехи в FruityLoops 3.5


3-1095268387
Павел Боровик
2004-09-15 21:13
2004.10.17
ADO и Access: GetTableNames


3-1094998993
ANB
2004-09-12 18:23
2004.10.17
Получение всех сообщений и DataSet-ов из MS SQL


14-1096282055
Маг Похмеляйнен
2004-09-27 14:47
2004.10.17
Спасите кролика!


14-1096360517
YurikGL
2004-09-28 12:35
2004.10.17
Штраф через мирового судью...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский