Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.23;
Скачать: CL | DM;

Вниз

Корректно ли делать так? WaitForSingleObject()   Найти похожие ветки 

 
Chorniy   (2008-02-26 06:51) [0]

Для паузы внутри метода Execute, потока TMyThread = class (TThread)
использую такую строчку
WaitForSingleObject(INVALID_HANDLE_VALUE, 1000);
так как объект с таким хендлом не может быть создан никогда

может ли привести к нежелательным результатам такой ход?


 
MBo ©   (2008-02-26 07:00) [1]

можно ведь Sleep(1000) сделать


 
Сергей М. ©   (2008-02-26 08:47) [2]

А каков практический смысл этой паузы ?


 
Chorniy   (2008-02-26 09:08) [3]


> А каков практический смысл этой паузы ?

если нужно, чтобы поток выполнял действия через какой-либо промежуток времени. Действия одинаковые, и пересодавать поток нет смысла.


> можно ведь Sleep(1000) сделать

да, слип будет правильнее ))) спасибо за совет.


 
Сергей М. ©   (2008-02-26 09:13) [4]


> нужно, чтобы поток выполнял действия через какой-либо промежуток
> времени


А если в течение "периода сна" потребуется немедленное завершение потока ? Об этом ты подумал ?


 
Chorniy   (2008-02-26 09:24) [5]

Да, а кстати что будет происходить с запущенной процедурой WaitForSingleObject при завершении потока? и где можно почитать про механизм работы WaitForSingleObject?

ведь действительно может случиться ситуация, когда нужно ждать объект... и не 1000мс а INFINITE... а тут хоп и поток уничтожают???


 
Сергей М. ©   (2008-02-26 09:30) [6]


> хоп и поток уничтожают


Если поток именно уничтожают (TerminateThread), то неважно чем поток занят в этот момент. Но принудительное уничтожение потока - это действие в аварийной ситуации,  выполнять это действие следует с полным пониманием его последствий.


 
Chorniy   (2008-02-26 09:30) [7]

написал так и проверил... вроде ничего не происходит) во всяком случае видимых ошибок не возникает.

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:33) [8]


> это действие в аварийной ситуации

ой я опоздал с постом))) вызвал Terminate... тут все должно быть нормально,
а как созадть именно аварийную ситуацию? аварийно уничтожить поток? без вызова корректных методов.


 
Сергей М. ©   (2008-02-26 09:41) [9]


> вызвал Terminate... тут все должно быть нормально


Метод Terminate всего лишь взводит внутренний флаг объекта TMyThread.
Анализом состояния этого флага (см. св-во Terminated) должен заниматься сам поток, а поскольку он занят выполнением wait-функции, завершить свое выполнение он никак не может.

Самое простое решение - поток не должен "засыпать" надолго, чтобы иметь возможность периодически (и как можно чаще) опрашивать состояние св-ва Terminated с целью обнаружения требования к нему извне "немедленно закругляться".


 
MBo ©   (2008-02-26 09:52) [10]

если в потоке нужно делать паузы на опред. время, и при этом иметь возможность остановить его - вполне подойдет WaitForSingleObject с ожиданием события и с таймаутом. Тогда, если нужно прервать паузу  - просто извне взводится событие.
Несколько объектов синхронизации - WaitForMultipleObjects


 
Leonid Troyanovsky ©   (2008-02-26 12:47) [11]


> Chorniy   (26.02.08 06:51)  

> WaitForSingleObject(INVALID_HANDLE_VALUE, 1000);
> так как объект с таким хендлом не может быть создан никогда

$FFFFFFFF - значение псевдохендла GetCurrentProcess.
Но, Sleep(1000) - выглядит более цивилизованно.

--
Regards, LVT.


 
Chorniy   (2008-02-26 12:55) [12]

Ок. всем спасибо, за разъяснение)


 
Сергей М. ©   (2008-02-26 12:59) [13]


> Chorniy   (26.02.08 12:55) [12]


В ряде случаев для этой цели удобно использовать PostThreadMessage + MsgWaitForMultipleObjects



Страницы: 1 вся ветка

Текущий архив: 2008.03.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
9-1168391727
Coll
2007-01-10 04:15
2008.03.23
Библиотеки проверки столкновений?


15-1202605179
Linker
2008-02-10 03:59
2008.03.23
Когда я пишу const aRecord в параметре функции, то туда передаётс


2-1203486854
серж
2008-02-20 08:54
2008.03.23
ComboBox


2-1203478710
Biomass
2008-02-20 06:38
2008.03.23
графическую зависимость данных от времени


2-1204013996
kiberg
2008-02-26 11:19
2008.03.23
свойство в виде массива