![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Корректно ли делать так? WaitForSingleObject()
Chorniy © (2008-02-26 06:51:00)Для паузы внутри метода Execute, потока TMyThread = class (TThread)
использую такую строчку
WaitForSingleObject(INVALID_HANDLE_VALUE, 1000);
так как объект с таким хендлом не может быть создан никогда
может ли привести к нежелательным результатам такой ход?
Сергей М. (2008-02-26 12:59:00) [1]
> Chorniy (26.02.08 12:55) [12]
В ряде случаев для этой цели удобно использовать PostThreadMessage + MsgWaitForMultipleObjects
Chorniy (2008-02-26 12:55:00) [2]Ок. всем спасибо, за разъяснение)
Leonid Troyanovsky (2008-02-26 12:47:00) [3]
> Chorniy (26.02.08 06:51)
> WaitForSingleObject(INVALID_HANDLE_VALUE, 1000);
> так как объект с таким хендлом не может быть создан никогда
$FFFFFFFF - значение псевдохендла GetCurrentProcess.
Но, Sleep(1000) - выглядит более цивилизованно.
--
Regards, LVT.
MBo (2008-02-26 09:52:00) [4]если в потоке нужно делать паузы на опред. время, и при этом иметь возможность остановить его - вполне подойдет WaitForSingleObject с ожиданием события и с таймаутом. Тогда, если нужно прервать паузу - просто извне взводится событие.
Несколько объектов синхронизации - WaitForMultipleObjects
Сергей М. (2008-02-26 09:41:00) [5]
> вызвал Terminate... тут все должно быть нормально
Метод Terminate всего лишь взводит внутренний флаг объекта TMyThread.
Анализом состояния этого флага (см. св-во Terminated) должен заниматься сам поток, а поскольку он занят выполнением wait-функции, завершить свое выполнение он никак не может.
Самое простое решение - поток не должен "засыпать" надолго, чтобы иметь возможность периодически (и как можно чаще) опрашивать состояние св-ва Terminated с целью обнаружения требования к нему извне "немедленно закругляться".
Chorniy (2008-02-26 09:33:00) [6]
> это действие в аварийной ситуации
ой я опоздал с постом))) вызвал Terminate... тут все должно быть нормально,
а как созадть именно аварийную ситуацию? аварийно уничтожить поток? без вызова корректных методов.
Сергей М. (2008-02-26 09:30:00) [7]
> хоп и поток уничтожают
Если поток именно уничтожают (TerminateThread), то неважно чем поток занят в этот момент. Но принудительное уничтожение потока - это действие в аварийнойситуации, выполнять это действие следует с полным пониманием его последствий.
Chorniy (2008-02-26 09:30:00) [8]написал так и проверил... вроде ничего не происходит) во всяком случае видимых ошибок не возникает.
var
Form1: TForm1;
MT: TMyThread;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
MT := TMyThread.Create(false);
end;
{ TMyThread }
procedure TMyThread.Execute;
begin
inherited;
WaitForSingleObject(INVALID_HANDLE_VALUE,10000);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
MT.Terminate;
end;
Chorniy (2008-02-26 09:24:00) [9]Да, а кстати что будет происходить с запущенной процедурой WaitForSingleObject при завершении потока? и где можно почитать про механизм работы WaitForSingleObject?
ведь действительно может случиться ситуация, когда нужно ждать объект... и не 1000мс а INFINITE... а тут хоп и поток уничтожают???
Сергей М. (2008-02-26 09:13:00) [10]
> нужно, чтобы поток выполнял действия через какой-либо промежуток
> времени
А если в течение "периода сна" потребуется немедленноезавершение потока ? Об этом ты подумал ?
Chorniy (2008-02-26 09:08:00) [11]
> А каков практический смысл этой паузы ?
если нужно, чтобы поток выполнял действия через какой-либо промежуток времени. Действия одинаковые, и пересодавать поток нет смысла.
> можно ведь Sleep(1000) сделать
да, слип будет правильнее ))) спасибо за совет.
Сергей М. (2008-02-26 08:47:00) [12]А каков практический смысл этой паузы ?
MBo (2008-02-26 07:00:00) [13]можно ведь Sleep(1000) сделать