Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];

Вниз

Корректно ли делать так? 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.006 c
2-1203705791
Eero
2008-02-22 21:43
2008.03.23
Как передать неявно созданный объект в процедуру?


6-1182958151
апвып
2007-06-27 19:29
2008.03.23
WebBrowser


2-1203691244
San1
2008-02-22 17:40
2008.03.23
наследование свойства OnMouseMove


15-1202831718
No_Dead
2008-02-12 18:55
2008.03.23
Что я потеряю?


15-1202597190
Андрей
2008-02-10 01:46
2008.03.23
разбирайте кто хочет





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский