Форум: "Начинающим";
Текущий архив: 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