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

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

Корректно ли делать так? 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) сделать


Наверх

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