ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.

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 массив строк, строки в него загружаются из файла, при запуске программы.
Кто что может посоветовать?
Заранее спасибо.
|
|
|

05.11.2009, 12:36
|
|
Участник форума
Регистрация: 02.07.2008
Сообщений: 132
Провел на форуме: 1035284
Репутация:
52
|
|
Пуховой
попробуй использовать
Код:
var
sect1 : TRTLCriticalSection;
В форм криэйт
Код:
initializeCriticalSection(sect1); // Инициализации критической секции
Код:
EnterCriticalSection (sect1); //войти в критическую секцию
//Твой код критического участка
LeaveCriticalSection(sect1); //выйти в критическую секцию
а это на форм дестрой
Код:
DeleteCriticalSection(sect1);
а ты случаем ни где не используеш terminateThread?
проверь еще выходит ли поток из критической секции..
Последний раз редактировалось transserg; 05.11.2009 в 12:43..
|
|
|

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. Первый (ваш) пока работает, тьфу-тьфу-тьфу.
Буду тестировать, спасибо огромное!
|
|
|

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;
В момент, когда критическая секция занята, в нее стучится этот код. И все - зависает.
Как иправить, подскажите, пожалуйста 
|
|
|

05.11.2009, 13:42
|
|
Участник форума
Регистрация: 02.07.2008
Сообщений: 132
Провел на форуме: 1035284
Репутация:
52
|
|
Пуховой попробуй не таймер использовать а отдельный поток
|
|
|

05.11.2009, 13:43
|
|
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме: 1702086
Репутация:
89
|
|
transserg, так и сделал... Но сама суть - почему все-таки программа зависает, при стуке таймера в критическую секцию? Вопрос покоя не дает 
|
|
|

05.11.2009, 13:49
|
|
Участник форума
Регистрация: 02.07.2008
Сообщений: 132
Провел на форуме: 1035284
Репутация:
52
|
|
2 Пуховой
Код:
http.ReadTimeout := 30000;
30 секунд ждать не много? если у тебя 1000 итераций то уйдет 60 часов + задержки таймера.
у тебя задержка в такймере сколько стоит?
Зависает всмысле форма не обновляется или программа ничего не делает?
если форма то добавть в цикл потока или той функции котороая больше всего времени отнимает
Application.ProcessMessage;
|
|
|

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;
При использовании критической секции другим потоком, в момент обращения таймера к ней программа также виснет (приостанавливают работу потоки, перестает отвечать главная форма).
Чую, надо ковырять глубже, интерес разобрал 
|
|
|

05.11.2009, 14:28
|
|
Участник форума
Регистрация: 02.07.2008
Сообщений: 132
Провел на форуме: 1035284
Репутация:
52
|
|
Пуховой
для того чтоб форма не подвисала используй Application.ProcessMessage; или как варинат преостанавливай потоки на время обновления списка проксей
|
|
|

05.11.2009, 14:38
|
|
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме: 1702086
Репутация:
89
|
|
transserg, application.processmessages здесь не поможет.
Известно одно - таймер тыкается в крит. секцию и все идет "не по плану". Буду копать глубже.
Спасибо за ответы 
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|