Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381

Где и что я напутал с потоком

23.03.2014, 20:41. Показов 2043. Ответов 36
Метки нет (Все метки)

Добрый день , сделал поток который просто переходит по ссылкам , что загружены в accounts , но вот где то я намудрил , и гет запрос идет только , сколько я поставил потоков, к примеру : ссылок загрузил 50 , а потоков поставил 30 , то гет запрос был произведен 31 раз .....

вот как вызываю :
Delphi
1
2
3
4
5
6
  Acc3:=-1;
 prox:=-1;
 Work3:=true;
 for Thread3:=0 to form3.sSpinEdit1.Value do
 TStas.Create(false);
 Thread3:=form3.sSpinEdit1.Value;
вот сам поток :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
procedure TStas.Execute;
var CurAcc, TP:integer;
    HTTP:THTTPSend;
    IP, Port:string;
    data:TStringStream;
    HTML, src:TStringList;
begin
 while Work3 do
  begin
   CS.Enter;
    Inc(Acc3);  Inc(prox);
    if Acc3<Accounts.Count then CurAcc:=Acc3 else Work3:=false;
    if prox<Proxy.Count-1 then TP:=prox else begin
      prox:=0;
      TP:=prox;
    end;
   CS.Leave;
 
   if Work3 then
    begin
 
     //copy login
 
     //copy proxy
     if Proxy.Text = '' then
     begin
      sleep(0);
     end
      else
     begin
     IP:=Copy(Proxy[TP], 1, Pos(':', Proxy[TP])-1);
     Port:=Copy(Proxy[TP],Pos(':',Proxy[TP])+1,Length(Proxy[TP]));
     end;
 
     HTTP:=THTTPSend.Create;
     //Заголовки
     with HTTP do begin
      Headers.Add('Referer: [url]http://mail.ru/');[/url]
      Headers.Add('Cache-Control: max-age=0');
      Headers.Add('Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01');
      MimeType:='application/x-www-form-urlencoded';
     // UserAgent:=GetRandomUserAgent;
      Headers.Add('Origin: [url]http://mail.ru');[/url]
      Headers.Add('Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3');
      Headers.Add('Accept-Encoding: gzip, deflate');
      Headers.Add('Connection: keep-alive');
     end;
 
     //POST
     data:=Tstringstream.Create;
     data.WriteString('email='+ Flogin+'&password='+ Fpassword+'&log_in=');
     HTTP.Document.LoadFromStream(data);
 
     //Proxy
     if Proxy.Text = '' then
      begin
      sleep(0)
      end else
     begin
     //socks
     if proxymode='socks' then
     begin
     HTTP.Sock.SocksIP:=IP;
     HTTP.Sock.SocksPort:=Port;
     end;
     //HTTP
     if proxymode='http' then
     begin
     HTTP.ProxyHost:=IP;
     HTTP.ProxyPort:=Port;
     end;
     end;
 
 
     if HTTP.HTTPMethod('GET', accounts[CurAcc]) then begin
    Flogin:=accounts[CurAcc];
     if pos('200', HTTP.Headers.Text)<>0 then
     begin
 
     Rezult:=1;
     end else
     begin
     Rezult:=0;
     end;
    
 //    form3.Memo1.Lines.Add('====  '+ HTTP.Headers.Text);
     HTTP.Free;
     src.Free;
     data.Free;
 
     Synchronize(Sync);
    end;
  end;
 
 dec(Thread3);
 if Thread3=0 then stopbrute();
end;


что не так я сделал ? + в другом приложении анологичная проблема, только гет запросы идет чуть дольше , тобишь загрузил 1000 ссылок , поставил 100 потоков, а перешло всего 150-200 .... ну мнеб с этим разобраться ... жду ваших советов ибо сам не знаю ...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.03.2014, 20:41
Ответы с готовыми решениями:

Где-то напутал с синтаксисом скрипта
Здравствуйте, друзья. Пытался сделать на странице форму для отправки на e-mail. Нашёл в интернетах рабочий скрипт, отредактировал...

Что-то напутал с добавлением строки в базу(
Здравствуйте, помогите пож. найти ошибку. Создал базу данных в панели управления open server. Добавляю в панели данные в базу ручками, все...

что то я событием напутал... а в чём именно???
namespace SimpleEvent { public delegate void EventHandler(); class EventListener { EventColler cll = new...

36
17 / 17 / 3
Регистрация: 28.05.2013
Сообщений: 246
25.03.2014, 07:14
Цитата Сообщение от vuasya Посмотреть сообщение
мой поток , должен переходить по всем ссылкам которые загружены , а он не хочет по всем , хотя почему не понятно
Он должен переходить по очередной ссылке только тогда, когда есть свободный вспомогательный поток.

А проверки на свободность вспомогательного потока я так и не увидел.

Добавлено через 11 минут
Ладно. Представь такую ситуацию: есть командир (основной поток) и 10 солдат (вспомогательные потоки).
Нужно выкопать 25 траншей.
Что должен сделать командир, чтоб выкопать все 25 траншей?
Он раздает по 1 заданию каждому солдату.
Далее командир ходит кругами вокруг траншей, проверяет, не закончил ли данный солдат свое задание.
Как только он обнаружил свободного отдыхающего солдата (Как так? Солдат, и отдыхает??? Непорядок!!!) командир дает солдату задание выкопать еще одну траншею.
Если все 25 траншей уже выкопаны, то он отсылает этого солдата обратно в часть (выключает поток, освобождает память, занимаемую этим потоком).

Вот по этому принципу и иди. По шагам делай. А чтоб большие куски, которые повторяются, не захламляли код -- выноси их в отдельные функции/процедуры и называй так, чтоб было понятно, что она делает.
Тогда у тебя будет нормальный читабельный код.

Больше я уже не знаю как объяснить.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
25.03.2014, 09:20
Цитата Сообщение от vuasya Посмотреть сообщение
просто по идее, мой поток , должен переходить по всем ссылкам которые загружены
Дурная идея.
Доп.поток должен работать конкретно с той ссылкой, которая ему указана потоком-диспетчером (его роль можно возложить на осн.поток) параметром конструктора потока.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
25.03.2014, 09:37  [ТС]
klaxwork, mss, может глупый вопрос, но я должен спросить , а что за дополнительный поток ? вот, например у меня поток procedure TStas.Execute; он является главным , так ? а дополнительный тогда что ? и как его создать ?
0
17 / 17 / 3
Регистрация: 28.05.2013
Сообщений: 246
25.03.2014, 09:51
vuasya, как я уже говорил: этот поток у тебя должен быть основным (командиром).
Далее создаешь массив из дополнительных потоков (солдат).
Основной только раздает задания дополнительным. А дополнительные уже выполняют всю грязную работу.
Я уже не знаю как объяснять...

Добавлено через 57 секунд
Мда... Тут надо сознание распараллеливать, чтоб можно было представить, чем одновременно занимаются разные потоки...
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
25.03.2014, 09:57
Цитата Сообщение от vuasya Посмотреть сообщение
у меня поток procedure TStas.Execute; он является главным , так ?
Это метод дополнительного потока.
А основной поток - это тот который создается при запуске приложения и в контексте которого работают твои формы.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
25.03.2014, 10:39  [ТС]
mss, klaxwork, не серчайте =) мне просто надо было понять где главный и где дополнительный , тогда мне щас создать еще около 2 таки же потоков и просто давать им задания из моего так ? а дополнительные потоки мне делать тоже многопоточными ? просто ведь гл у меня многопоточный ...
0
17 / 17 / 3
Регистрация: 28.05.2013
Сообщений: 246
25.03.2014, 10:42
Есть еще один способ.
Без основного потока. Сделать массив с заданиями. И по очереди запустить все потоки.
Каждый поток проходит по массиву с заданиями и ищет первое невзятое задание. Потом меняет флаг Ordered на True (чтоб остальные потоки его не взяли) и выполняет его. Как только завершает выполнение -- добавляет ответ в другой массив.

Добавлено через 1 минуту
Цитата Сообщение от vuasya Посмотреть сообщение
а дополнительные потоки мне делать тоже многопоточными ?
Ничего себе загнул........... Поток не может быть многопоточным...
Я так понял, что твой поток запускает сам себя. Т.е. происходит рекурсия. Как итог -- бесконечное создание множества бессмысленных потоков.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
25.03.2014, 10:52
Цитата Сообщение от vuasya Посмотреть сообщение
гл у меня многопоточный
Может тебе все-таки отложить на время свою бурную деятельность и поштудировать хоть какие-нибудь учебники ?
Ведь абсолютное же непонимание тобой ключевых концепций ..
1
 Аватар для chizz
993 / 521 / 102
Регистрация: 19.03.2013
Сообщений: 3,114
Записей в блоге: 19
25.03.2014, 10:55
вот до чего не люблю mss, а не согласиться невозможно.
vuasya, учи матчасть
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
25.03.2014, 11:10  [ТС]
бл* ребят, говоря потока я имел в виду не отдельный поток, а всю функцию Execute .... и читая , что вы пишите поток я думал про всю процедуру .... мда ... тогда вот что : так я же создал критическую секцию , и дал каждому потоку свой акк для выполнения
Delphi
1
2
3
4
5
6
7
8
 CS.Enter;
    Inc(Acc3);  Inc(prox);
    if Acc3<Accounts.Count then CurAcc:=Acc3 else Work3:=false;
    if prox<Proxy.Count-1 then TP:=prox else begin
      prox:=0;
      TP:=prox;
    end;
   CS.Leave;
т.е поток берет 1 акк и делает на него гет запрос и т.д потоки чередуются пока не закончатся акки....
и потом каждый поток делает свой гет запрос HTTP.HTTPMethod('GET', accounts[CurAcc])
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
25.03.2014, 11:39

Не по теме:

Цитата Сообщение от chizz Посмотреть сообщение
вот до чего не люблю mss
Вот до чего мне по барабану любишь ты меня или нет, но не согласиться с "учи матчасть" невозможно)



Добавлено через 5 минут
Цитата Сообщение от vuasya Посмотреть сообщение
так я же создал критическую секцию
А нахрена ты вообще ее создавал ?
За каким лешим твой поток полез в разделяемые между потоками ресурсы ?
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
25.03.2014, 12:00  [ТС]
mss, но ведь тогда я могу точно знать , что 1 поток возьмет только 1 акк и не будет повторяться ...
0
17 / 17 / 3
Регистрация: 28.05.2013
Сообщений: 246
25.03.2014, 12:04
mss, он действует по принципу "кто первый встал, того и тапки"...
Т.е. поток берет аккаунт, берет соответствующий прокси и ими пользуется. Но у него я не обнаружил никакой проверки, не взял ли этот аккаунт с проксей какой-то другой поток... И никакой блокировки, чтоб эту пару (акк/прокси) не смог взять другой поток...
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
25.03.2014, 12:15
Цитата Сообщение от vuasya Посмотреть сообщение
ведь тогда я могу точно знать , что 1 поток возьмет только 1 акк и не будет повторяться
Доп.поток должен брать то что ему поток-диспетчер дает сам и явно, а не лезть туда куда ему лазить не следует !

Поток-диспетчер должен сам распределять задания по доп.потокам.
Передача задания - это передача фактическим параметром вызова подпрограммы, например, текстовой строки с URL.

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

Добавлено через 8 минут

Не по теме:

Цитата Сообщение от klaxwork Посмотреть сообщение
у него я не обнаружил никакой проверки, не взял ли этот аккаунт с проксей какой-то другой поток
Все потому что этот говнокод был попросту содран бездумно)

0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
25.03.2014, 13:37  [ТС]
mss,
Все потому что этот говнокод был попросту содран бездумно)
уверен ? вобще я делал по этому уроку https://www.youtube.com/watch?v=UfG93mq0Vxw или на http://avtuh.ru/ просто я его переделал под синапс + ко всему ради интереса я создал отдельное приложение где просто поставил эти же условия (изначально что у меня были ) тобишь просто делать гет запрос и он делал хорошо , перенес этот поток в свое приложение и тут опять все плохо
0
17 / 17 / 3
Регистрация: 28.05.2013
Сообщений: 246
25.03.2014, 13:46
Цитата Сообщение от vuasya Посмотреть сообщение
Delphi
1
2
3
for Thread3:=0 to form3.sSpinEdit1.Value do
TStas.Create(false);
Thread3:=form3.sSpinEdit1.Value;
Честно говоря, я не совсем понял данные строчки.
То ли у тебя begin-end цикла for не проставлены, то ли ты сразу после цикла счетчик ставишь на максимум...

Delphi
1
2
 dec(Thread3);
 if Thread3=0 then stopbrute();
А в этих строках в самом потоке ты сразу счетчик убавляешь на единицу. Но если ты думаешь, что это будет номером потока, то ты сильно ошибаешься.
Это просто количество запущенных потоков.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
25.03.2014, 14:28
Цитата Сообщение от vuasya Посмотреть сообщение
уверен ?
Конечно)

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

Добавлено через 27 минут
vuasya, вот здесь я в столохматый раз уже разжевывал ту же самую тему)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.03.2014, 14:28

Что-то напутал в цикле, страшные слова в браузере показались
Что-то не то здесь function db_result_to_array($result) { $row=array(); while($arr=mysqli_fetch_assoc($result)){ ...

Вычислить сумму ряда. Где-то напутал знаки или формула ряда не правильная. Посмотрите свежим взглядом.
Привет! Пишу простую контрольную, не могу понять, то ли я где-то со знаками туплю, то ли формула не корректна. Задание: Мое...

Где ошибка в коде при работе с потоком?
В общем при обработке ошибок если находит в полученном ответе ... Invalid, то это ошибка и тогда он завершает цикл while, который...

Что не так с потоком?
Есть поток вот: constructor TChangeMonitor.Create(ASuspended: boolean; ADirectory: string; AScanSubDirs: boolean); begin ...

Интересно что происходит с потоком
Всем доброго времени суток, возможно это глупый вопрос, но я не знаю на его ответа. Допустим я вот так инициализирую переменную типа String...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru