Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 33

Мистическое исчезновение потоков

04.06.2016, 16:29. Показов 1837. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, гуру форума! Пишу программку, основанную на потоках и http/https запросах. Сейчас объясню в чём собственно проблема заключается..
Сначала создаётся глобальный массив из потоков:
Delphi
1
MyT : array[1..1000] of TMyThread;
Затем я запускаю эти потоки:
Delphi
1
2
3
4
5
6
7
8
9
  for i := 1 to n do
    begin
    MyT[i]:= TMyThread.create(true, i, mol[i].beg , mol[i].en, lo, pa);
    dec(mak[i].proverka);
    MyT[i].priority:= tpnormal;
    MyT[i].FreeOnTerminate:= true;
    MyT[i].start;
    wait(1);
    end;
n - это количество потоков, mol[i].beg и mol[i].en - начальное и конечное значение обрабатываемых данных из массива(чтобы потоки не пересекались, решил поставить такую логику. каждый поток работает со своей частью массива), lo и pa - это логин и пароль от проксиков(это уже не столь важно ), и через mak[i].proverka я проверяю завершился ли данный поток. start использую, потому что на resume делфи ругается, мол ненадёжный оператор.
Потоки запускаются, запускаются,по началу всё работает как часы:
Delphi
1
2
3
4
5
6
for plok := beg to en do
begin
r:= plok;
if not vremya(mak[r].time) then
begin
...
цикл от начала и до конца значений, заданных потоку. Массив mak[r].time тоже глобальный, хоть это и чтение, но всё равно потоки, по идее, не должны обращаться к одному и тому же значению массива одновременно.
функция vremya просто сравнивает значение времени в массиве с настоящим моментом и выдаёт true, если прошло меньше часа(не знаю почему, но переменные boolean в потоке не хотят принимать значение false, только через dec() ):
Delphi
1
2
3
4
5
6
7
8
function TMyThread.vremya(date: TdateTime): boolean;
var diff: double;
begin
result:= true;
diff:= now - date;
diff:= diff*24;
if diff>1 then dec(result);
end;
Итак, затем идёт долгое и нудное составление http запросов, try except, все дела, программа делает своё дело и изменяет время в массиве(естественно через synchronize(), хотя в принципе не знаю зачем он тут), в зависимости от ответа сервера. Вот пример:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
if pos('s1',sab)<>0 then
  begin
   synchronize(MemoAdd);
   number:=sab;
   Delete(number,1,pos(':',number));
   Delete(number,1,pos(':',number));
   Delete(number,1,pos(':',number));
   Delete(number,1,pos('.',number));
   Delete(number,pos(':',number),length(number));
   number:= inttostr(strtoint(number));
   synchronize(labl);
   synchronize(labl2);
  end
синхронизация в lable'ы для статистики и процедура MemoAdd вот:
Delphi
1
2
3
4
5
procedure TMyThread.MemoAdd;
begin
  mak[r].time:= now;
  Form1.memo1.lines.add('('+inttostr(r)+') '+TimeToStr(mak[r].time)+'...................................OK');
end;
Когда цикл закончился поток говорит, что закончил своё действие через переменную:
Delphi
1
mak[terminator].proverka:= true;
А с главного потока постоянно эта переменная проверяется:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
while work do
begin
for i := 1 to n do
  if mak[i].proverka then
  begin
  MyT[i]:= TMyThread.create(true,i, mol[i].beg, mol[i].en, lo, pa);
  dec(mak[i].proverka);
  MyT[i].priority:= tpnormal;
  MyT[i].FreeOnTerminate:= true;
  MyT[i].start;
  wait(1);
  end;
wait(5);
end;
Собственно проблема в том, что проработав часов 5 программа просто останавливается. Может не выполняется условие в потоке, может потоки не хотят запускаться, я не знаю. Не большие у меня познания в потоках, так что прошу помощи у вас
Если есть подозрения, что программа останавливается из-за внутренностей самого потока, то вряд ли, потому что, когда поток был только один, она работала на ура сутки напролёт и даже не подавала виду на крах.
На всякий случай вот создание и уничтожение всего нужного внутри потока:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  http1:= Tidhttp.Create(nil);
  cookie:= Tidcookiemanager.Create(nil);
  socksinfo:= Tidsocksinfo.Create(nil);
  socksinfo.Version:= svsocks5;
  socksinfo.Host:= mak[r].ip;
  socksinfo.port:= strtoint(mak[r].port);
  socksinfo.Authentication:= saUsernamePassword;
  socksinfo.Username:= login;
  socksinfo.Password:= pass;
  handler:= TIdSSLIOHandlerSocketOpenSSL.Create();
  http1.CookieManager:=cookie;
  handler.TransparentProxy:=socksinfo;
  http1.IOHandler:=handler;
  http1.AllowCookies:= true;
  p:= TStringList.Create;
  http1.HTTPOptions:=[hoKeepOrigProtocol,hoForceEncodeParams];
  http1.ConnectTimeout:= 5000;
  http1.ReadTimeout:= 5000;
Ну и безжалостное убийство:
Delphi
1
2
3
4
5
6
7
  p.Clear;
  http1.Request.Clear;
  http1.Request.CustomHeaders.Clear;
  cookie.CookieCollection.Clear;
  http1.Free;
  cookie.Free;
  socksinfo.Free;
Если есть добрые люди, которым не влом читать эту ахинею и знают как помочь, отзовитесь пожалуйста)

Добавлено через 8 минут
Единственное, что в однопоточной программе не было массива со временем, а вместо него был таймер. Но сейчас таймер не прокатит, ибо слишком большой объём информации и работа потоков не синхронна.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.06.2016, 16:29
Ответы с готовыми решениями:

Мистическое исчезновение папки!
Доброго времени суток, господа. Нуждаюсь в помощи экспертов. Недавно переустановил ОСь (впервые перешел с семёрки на десятку —*принимаю...

Появление/исчезновение элементов и исчезновение при клике на другой
Привет. Есть такое меню (картинка ниже). Нужно чтобы при клике на ссылку, появлялись текст и картинка. Вообщем, я хотел сделать через...

Мистическое зависание
Привет Всем! Есть у меня проблема, и никак я не могу с ней разобраться. Расскажу немного длинновато, зато подробно, чтобы было видно...

40
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
06.06.2016, 15:32
Студворк — интернет-сервис помощи студентам
не внутрь потока, а снаружи
если поток не вернулся за N мсек, его можно просто убить
а если вернулся после тайм-аута, игнорировать результаты, которые он принес
таймер просто через заданный интервал чистит текущий список потоков, либо помечает там что-то
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.06.2016, 15:32
Помогаю со студенческими работами здесь

Мистическое самодобавление языков
Алоха ;) Не могли бы вы мне часом подсказать какая зараза в моей Win 7 Pro решает за меня какие мне языки ввода нужны? Вот такая вот...

BSOD 0x000000f4 мистическое :)
Прошу уважаемое сообщество помочь разобраться, ибо остался видимо вариант шамана с бубном или экзорцизма. Ситуация следующая. ...

Что-то мистическое с флешкой KingSton
Доброго времени суток. Такая ситуация: флешка KingSton на 32Gb, какая точная модель не знаю, это знакомый попросил мне помочь...

Мистическое кэширование PHP на уровне сервера
Заказали мне скрипт, написал, отдал заказчику, а у него он как-то криво работает. Стал разбираться и вот что получилось: Создаём любой...

Область видимости общей переменной для потоков + закрытие потоков
Есть два вопроса про потоки. Первый. Как можно сделать общую переменную для основного потока и моих ? struct ThreadInfo1 { int...


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

Или воспользуйтесь поиском по форуму:
41
Ответ Создать тему
Новые блоги и статьи
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru