Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2017, 11:03   #1
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию Проблема с потоками

Доброго времени суток уважаемые форумчане.
Столкнулся с проблемой.
Взял последнюю версию модуля для работы с потоками отсюда,
переписал исходник (убрал все утечки памяти путем удаления из него глюкавых InDy, заменив им на привычный мне Synapse).
Осталась проблема, при запуске одного потока, мой исходник работает нормально (и утечек памяти нет), но при одновременном запуске более одного потока программа вываливается с AV:

https://image.prntscr.com/image/rRsR...wechPSPfMA.png

Потоки запускаются таймером, таймер запуска потоков следит за текущим количеством потоков, и если оно меньше заданного в настройках программы, то таймер создает дополнительный поток.

вот кусок кода с запуском потоков, думаю что тут все в полном порядке:
Код:
procedure TForm1.CreateThreadTimer(Sender: TObject);
begin

if CheckCountThreads<strtoint(edit2.Text) then begin
   with TGetHTTP.Create do
  begin
    OnComplete := Complete;
    OnProgress := Progress;
    Get(memo2.Lines[postline],'',0); // URL,   ProxyHost,   ProxyPort
    inc(postline);
  end;
 if postline=memo2.Lines.Count then CreateThread.Enabled:=false;
// если текущий URL равен последнему из списка, то выключаем таймер запуска потоков
 end;

end;
Так как кода много, приложу исходник целиком, прощу Вашей помощи.
Основной код работы с потоками реализован в модуле uGetHttpThread.pas, вчера несколько часов потратил на выявление бага, но увы ничего не вышло. Вся надежда на Вас.
Исходник максимально упростил и выкинул все лишнее чтоб глаза не мозолило.

Спасибо всем за любую помощь в решении данной проблемы.

Сам исходник - http://myfiles.pro/uploads/684539109.FORUM.rar
denis76560 вне форума Ответить с цитированием
Старый 22.11.2017, 11:18   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Что-то как-то стрёмно качать с непровернного ресурса, на который даже Гугля ругается, что там вирус недавно нашли

Ну и по коду:

Код:
    Get(memo2.Lines[postline],'',0); // URL,   ProxyHost,   ProxyPort
    inc(postline);
Я так понимаю, inc(postline) выполняется в каждом запущенном потоке. Если она объявлена не в классе TGetHTTP, то тут требуется либо синхронизация, либо критические секции.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 22.11.2017 в 11:23.
Sciv вне форума Ответить с цитированием
Старый 22.11.2017, 11:21   #3
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

Скажите куда залить, перезалью, на форум залить не получается.
Хотя удивительно, что ругается, у меня с хромом при заходе на файлообменник никаких проблем нет, да и в архиве бинарников тоже нету.

https://mega.nz/#!3YUAyBTJ!GLEOUBifJ...eZJc0JUvsgbFks
http://ge.tt/6lNIORn2

Последний раз редактировалось denis76560; 22.11.2017 в 11:29.
denis76560 вне форума Ответить с цитированием
Старый 22.11.2017, 11:49   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от denis76560 Посмотреть сообщение
да и в архиве бинарников тоже нету.
dll-ки есть

А хром ругается не потому что именно в Вашем архиве вирус, а потому что "недавно на этом файлообменнике были обнаружены вирусы". Это типа предупреждение такое.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 22.11.2017, 11:55   #5
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
dll-ки есть

А хром ругается не потому что именно в Вашем архиве вирус, а потому что "недавно на этом файлообменнике были обнаружены вирусы". Это типа предупреждение такое.
Про ФО-возможно, просто у меня по дефолту отключена эта защита в настройках браузера, а про DLLки, действительно, я и забыл про них. Но они 100% чистые.
Если они вызывают у Вас сомнения, можете их смело удалить, они там нужны только для возможности работать с HTTPS (SSL) протоколом.

Насчет синхронизации и критических секций, там это все уже прописано.

Последний раз редактировалось denis76560; 22.11.2017 в 12:12.
denis76560 вне форума Ответить с цитированием
Старый 22.11.2017, 12:13   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от denis76560 Посмотреть сообщение
Если они вызывают у Вас сомнени
Да нет, я в курсе, что это за dll.

В общем, запустил программу, вылетает у меня на AbortClose, вот тут:

Код:
      p := TSynaOption(FDelayedOptions[n]);
      p.Free;
Если бы Вы воспользовались трассировкой, то сами бы нашли это место. Кстати, в чём сакральный смысл сначала присваивать переменной чего-то, а потом сразу делать ей Free?

UPDATE.
Кажется, последний вопрос надо адресовать не Вам, а разработчикам синапсов.

Как и необходимость создания целого класса для вот этого:

Код:
  {:@abstract(this object is used for remember delayed socket option set.)}
  TSynaOption = class(TObject)
  public
    Option: TSynaOptionType;
    Enabled: Boolean;
    Value: Integer;
  end;
Вероятно, использование record у них под жестоким запретом :D
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 22.11.2017 в 12:19.
Sciv вне форума Ответить с цитированием
Старый 22.11.2017, 12:21   #7
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

Син
Цитата:
Сообщение от Sciv Посмотреть сообщение
Да нет, я в курсе, что это за dll.

В общем, запустил программу, вылетает у меня на AbortClose, вот тут:

Код:
      p := TSynaOption(FDelayedOptions[n]);
      p.Free;
Если бы Вы воспользовались трассировкой, то сами бы нашли это место. Кстати, в чём сакральный смысл сначала присваивать переменной чего-то, а потом сразу делать ей Free?
Ну это виднее автору синапса.
Попробовал так
Код:
  for n := FDelayedOptions.Count - 1 downto 0 do
    begin
    //  p := TSynaOption(FDelayedOptions[n]);
      p.Free;
    end;
Это на результат не повлияло =(
denis76560 вне форума Ответить с цитированием
Старый 22.11.2017, 12:41   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Попробовал так
И сделали еще одну ошибку. Вы объект не создали, а пытаетесь к его методам обращаться...

Цитата:
Это на результат не повлияло =(
Ну если за результат вы считаете уронить прогу, то да.
p51x вне форума Ответить с цитированием
Старый 22.11.2017, 12:48   #9
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

Полагаю, что тут дело не в библиотеке Synapse, а в работе с потоками (вероятно с завершением потока). Так как с одним потоком все работает нормально и без глюков, без утечек памяти приложения. А вот работа двух и более потоков приводит к данной ошибке.
denis76560 вне форума Ответить с цитированием
Старый 22.11.2017, 12:49   #10
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
И сделали еще одну ошибку.
Согласен. На самом деле вся эта конструкция предназначена как раз для очистки памяти, которая выделяется для хранения параметров. Которые хранятся (почему-то) в вышеназванном классе. ИМХО авторы придумали лишнего геморроя на свою ...

Хотя в других исходниках не смотрел, не исключено, что этот класс где-то и наследуется.

В данном случае в какой-то момент программа пытается очистить памяти больше, чем она выделила (то есть для двух потоков создаётся два сокета, но очистить она пытается памяти на параметры для трёх сокетов).
По крайней мере, под дебагом у меня так и произошло: для двух запущенных потоков три раза программа попадала в эту процедуру, два первых, что вполне естественно, отработали, третий упал.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с потоками UKRtortik Общие вопросы Delphi 14 01.03.2014 12:16
Проблема с потоками Dremst Общие вопросы Delphi 5 17.02.2014 15:14
Проблема с потоками Bax77 Общие вопросы Delphi 3 29.01.2013 16:11
Проблема с потоками vlad.md Мультимедиа в Delphi 0 07.03.2012 22:55
Проблема с потоками vitalik007 Общие вопросы Delphi 1 11.03.2008 22:35