-
Скажите, а стоит ли проверять ? Я не встречал случаев, когда поток не запускался. Проверяю, кстати, так :
в самом теле треда первой строкой идет
SetEvent(Event);
...
var FEvent:THandle;
P:PJobThread;
begin
Result:=True;
FEvent:=CreateEvent(nil,True,False,nil); ResetEvent(FEvent);
New(P);
P^.SocketDial:= Self;
P^.Event:=FEvent;
FJobThread:=BeginThread(nil, 0, MsgThread, P, 0, FJobThreadID);
case WaitForSingleObject(FEvent,2000) of
WAIT_OBJECT_0:;
else
begin
Result:=False;
Exception.Create(sCannotStart);
end;
end;
CloseHandle(FEvent);
end;
Т.е. интересуют, прежде всего, мнения на счет стоит или не стоит. Спасибо !
-
стоит
-
Стоит обязательно, я как раз периодически встречаюсь с ситуацией когда нить не создается из-за нехватки системных ресурсов...
-
> Стоит обязательно, я как раз периодически встречаюсь с ситуацией > когда нить не создается из-за нехватки системных ресурсов. > ..
Это случай с сокетами ? Когда каждая нить обслуживает отдельный сокет клиента ?
-
> Это случай с сокетами ?
По барабану с чем. Поток не может быть создан, если недостаточно ресурсов для его создания. А уж куда испарились эти ресурсы - то совсем иной вопрос.
-
Понял. Тогда расскажите, что происходит.
> If the function succeeds, the return value is a handle to > the new thread. > If the function fails, the return value is NULL.
Создается хендл, но нити нет? Или получу NULL при BeginThread ? Т.е. как мне контролировать ? Моего кода с Event'ом достаточно будет ?
-
> Т.е. как мне контролировать ?
Win32Check(returnHandle <> 0)
-
> GanibalLector © (27.01.10 13:05) [5]
> Создается хендл, но нити нет? Или получу NULL при BeginThread > ?
Для дельфи 6 - хендл создается - нить есть, но не значит, что она тут же будет запущена и получит управление, на то воля ОС. BeginThread возвращает результат CreateThread - если вернет NULL, значит нить не создана. В теории возможна ситуация, когда из BeginThread выход будет по исключению (Exception при New). Мне кажется кода с Event'ом будет достаточно для проверки, что нить получила(получала) управление.
|