HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 05.11.2009, 11:57
Пуховой
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме:
1702086

Репутация: 89
По умолчанию

Использую при создании ПО критические секции. Но одна из последних программ постоянно зависает и, чую я, по вине неправильного их использования.

Грешу на кусочек кода в потоке:
Код:
  if accounts.Count > 0 then
  begin
    CriticalSection.Enter;
      account := accounts.Strings [0];
      accounts.Delete (0);
    CriticalSection.Leave;
  end else
  begin
    to_log ('come to an end accounts');
    exit;
  end;
и функцию:
Код:
function to_used (str : string) : integer;
var
  t : textfile;
begin
  CriticalSection.Enter;
    assignfile (t, curdir + '\config\send - used accounts.txt');
    append (t);
    writeln (t, str);
    closefile (t);
  CriticalSection.Leave;
  Result := 1;
end;
accounts - tstringlist массив строк, строки в него загружаются из файла, при запуске программы.

Кто что может посоветовать?

Заранее спасибо.
 
Ответить с цитированием

  #2  
Старый 05.11.2009, 12:36
transserg
Участник форума
Регистрация: 02.07.2008
Сообщений: 132
Провел на форуме:
1035284

Репутация: 52
Отправить сообщение для transserg с помощью ICQ
По умолчанию

Пуховой
попробуй использовать
Код:
 var
  sect1 : TRTLCriticalSection;
В форм криэйт
Код:
 initializeCriticalSection(sect1);        // Инициализации критической секции
Код:
EnterCriticalSection (sect1); //войти в критическую секцию
//Твой код критического участка
LeaveCriticalSection(sect1); //выйти в критическую секцию
а это на форм дестрой
Код:
  DeleteCriticalSection(sect1);
а ты случаем ни где не используеш terminateThread?
проверь еще выходит ли поток из критической секции..

Последний раз редактировалось transserg; 05.11.2009 в 12:43..
 
Ответить с цитированием

  #3  
Старый 05.11.2009, 12:52
Пуховой
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме:
1702086

Репутация: 89
По умолчанию

transserg, спасибо, буду пробовать без "обертки" TCriticalSection.

Тестирую очень просто.

Код потока без обертки TCriticalSection:
Код:
procedure inv.Execute;
begin
  EnterCriticalSection (CriticalSection);
    form1.Memo2.Lines.Add (timetostr (time));
  LeaveCriticalSection (CriticalSection);
  new_inv (); // запуск нового потока
end;
Код потока с оберткой TCriticalSection:
Код:
procedure inv.Execute;
begin
  CriticalSection.Enter;
    form1.Memo2.Lines.Add (timetostr (time));
  CriticalSection.Leave;
  new_inv (); // запуск нового потока
end;
Второй вариант "поломался" на 20000-ной строчке в memo. Первый (ваш) пока работает, тьфу-тьфу-тьфу.

Буду тестировать, спасибо огромное!
 
Ответить с цитированием

  #4  
Старый 05.11.2009, 13:30
Пуховой
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме:
1702086

Репутация: 89
По умолчанию

Отловил я-таки момент зависания.

В процедуре обновления списка прокси-серверов.

Код:
procedure TForm1.Timer3Timer(Sender: TObject);
var
  s : widestring;
  http : tidhttp;
begin
  http := tidhttp.create;
  http.ReadTimeout := 30000;
  s := httpget (http, 'http://awmproxy.com/proxy.php?Id=********&d=1');
  if extractb (s, '[^\r\n]*[^\r\n]') <> nil then
  begin
    CriticalSection.Enter;
      proxys.Clear;
      proxys.AddStrings (extractb (s, '[^\r\n]*[^\r\n]'));
    CriticalSection.Leave;
  end;
  http.Free;
end;
В момент, когда критическая секция занята, в нее стучится этот код. И все - зависает.

Как иправить, подскажите, пожалуйста
 
Ответить с цитированием

  #5  
Старый 05.11.2009, 13:42
transserg
Участник форума
Регистрация: 02.07.2008
Сообщений: 132
Провел на форуме:
1035284

Репутация: 52
Отправить сообщение для transserg с помощью ICQ
По умолчанию

Пуховой попробуй не таймер использовать а отдельный поток
 
Ответить с цитированием

  #6  
Старый 05.11.2009, 13:43
Пуховой
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме:
1702086

Репутация: 89
По умолчанию

transserg, так и сделал... Но сама суть - почему все-таки программа зависает, при стуке таймера в критическую секцию? Вопрос покоя не дает
 
Ответить с цитированием

  #7  
Старый 05.11.2009, 13:49
transserg
Участник форума
Регистрация: 02.07.2008
Сообщений: 132
Провел на форуме:
1035284

Репутация: 52
Отправить сообщение для transserg с помощью ICQ
По умолчанию

2 Пуховой
Код:
http.ReadTimeout := 30000;
30 секунд ждать не много? если у тебя 1000 итераций то уйдет 60 часов + задержки таймера.

у тебя задержка в такймере сколько стоит?
Зависает всмысле форма не обновляется или программа ничего не делает?
если форма то добавть в цикл потока или той функции котороая больше всего времени отнимает
Application.ProcessMessage;
 
Ответить с цитированием

  #8  
Старый 05.11.2009, 14:13
Пуховой
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме:
1702086

Репутация: 89
По умолчанию

transserg, задержка в таймере - 10 минут. Т.е. - каждые 10 минут обновляется список прокси-серверов, но дело не в этом. Критическая секция используется только при обновлении самого списка, не более, а на это уходит дай бог 1 мсек.

Сл. эксперимент. Тело таймера:
Цитата:
procedure TForm1.Timer3Timer (Sender: TObject);
begin
CriticalSection.Enter;
proxys.Clear;
proxys.Add ('12345');
CriticalSection.Leave;
end;
При использовании критической секции другим потоком, в момент обращения таймера к ней программа также виснет (приостанавливают работу потоки, перестает отвечать главная форма).

Чую, надо ковырять глубже, интерес разобрал
 
Ответить с цитированием

  #9  
Старый 05.11.2009, 14:28
transserg
Участник форума
Регистрация: 02.07.2008
Сообщений: 132
Провел на форуме:
1035284

Репутация: 52
Отправить сообщение для transserg с помощью ICQ
По умолчанию

Пуховой
для того чтоб форма не подвисала используй Application.ProcessMessage; или как варинат преостанавливай потоки на время обновления списка проксей
 
Ответить с цитированием

  #10  
Старый 05.11.2009, 14:38
Пуховой
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме:
1702086

Репутация: 89
По умолчанию

transserg, application.processmessages здесь не поможет.

Известно одно - таймер тыкается в крит. секцию и все идет "не по плану". Буду копать глубже.

Спасибо за ответы
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Wi-Fi, BT] Задай вопрос - получи ответ! Alexsize Беспроводные технологии/Wi-Fi/Wardriving 2568 25.04.2026 12:58
[jQuery] - Задай вопрос, получи ответ Isis PHP 62 25.12.2009 03:25



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ