![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WaitForSingleObject
ford © (2012-11-21 10:33:00)Добрый день!
Написал небольшую процедуру, для обработки регулярными выражениями (TRegExpr) большого массива данных, переданного пользователями. Из-за некорректных данных, процедура иногда повисает. Попытался исправлять ошибки в данных из-за которых происходит зависание, но всего предусмотреть не получается.
Решил вывести процедуру обработки в отдельный поток и завершать его принудительно если он работает более минуты. Наискавшись в интернет, сделал такой от класс:
type TThrSearch=class(TThread)
private
fData:String;
fExpr:String;
public
constructor create(expr,Data:String);
destructor destroy; override;
procedure Execute; override;
end;
Constructor TThrSearch.create;
begin
inherited Create(True);
fData:=data;
fExpr:=expr;
End;
destructor TThrSearch.destroy;
Begin
inherited;
End;
procedure TThrSearch.Execute;
Var r:TRegExpr;
k:Integer;
Begin
try
ReturnValue:=-1;
k:=0;
r:=TRegExpr.Create;
r.Expression:=fexpr;
if r.Exec(fData) Then
Begin
repeat
inc(k);
until not r.ExecNext;
End;
finally
r.Free;
ReturnValue:=k;
end;
End;
далее в программе создаю объект этого класса и выполняю метод Execute;
try
k:=0;
h:=TThrSearch.create(expr,st.Text);
h.Execute;
res:=WaitForSingleObject(h.Handle,2000);
if h.ReturnValue=-1 Then h.Terminate
Else k:=h.ReturnValue;
finally
h.Free;
result:=k;
end;
На сколько я понял
процедура WaitForSingleObject, должна останавливать основной поток программы и ждать сигнала от потока о завершении и если не дождалась то по таймауту передать управление основному потоку. Но
в при выполнении строки
res:=WaitForSingleObject(h.Handle,2000);
программа не зависимо от того завершился поток или нет, ждет указанный 2000 миллисекунд.
Подскажите, где ошибка, почему WaitForSingleObject, всегда ждет установленное таймаутом время и не реагирует на завершение процедуры execute?
DVM (2012-11-21 10:39:00) [41]
> Попытался исправлять ошибки в данных из-за которых происходит
> зависание, но всего предусмотреть не получается.
> Решил вывести процедуру обработки в отдельный поток и завершать
> его принудительно если он работает более минуты.
Если поток подвиснет на execute как завершать то его будешь? В чем заключается подвисание? В цикл бесконечный что ли где попадаешь? Цкл твой или внутри TRegExpr?