Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

WaitForSingleObject


Страницы:   1 2 3

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?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо