Главная страница
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.015 c
2-1204092389
Тимон.
2008-02-27 09:06
2008.03.23
Вопрос по TSQLConnection


9-1167927313
<<=_!!!YO!!!_=>>
2007-01-04 19:15
2008.03.23
Движение камеры да мышкой


3-1193829886
adamas
2007-10-31 14:24
2008.03.23
Клонирование набора данных!


2-1188057946
Bora.ru
2007-08-25 20:05
2008.03.23
Установка атрибутов файла


15-1202824478
Iam
2008-02-12 16:54
2008.03.23
Бесплатная междугородняя IP-телефония