![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ожидание начала работы нити.
Riply © (2007-01-04 02:45:00)Здравствуйте !
Мне надо убедиться, что нить приступила к работе.
Пытаюсь делать, примерно, так:
function ReallyStartedThread(const pParam: PThreadParam): DWord;
var
Msg: TMsg;
begin
Result := 0;
while GetMessage(Msg, 0, 0, 0) do
if Msg.message = REQUEST_EXISTS then Break else Sleep(0);
// .....
end;
function BeginRealStartThread(const aMode: DWord): Boolean;
var
hThread, ThreadID: DWord;
begin
Result := False;
hThread := BeginThread(nil, 0, @ReallyStartedThread, nil, 0, ThreadID);
if hThread <> 0 then
try
while not PostThreadMessage(ThreadID, REQUEST_EXISTS, 0, 0) do
if WaitForSingleObject(hThread, 1) <> WAIT_TIMEOUT then Exit;
Result := True;
finally
CloseHandle(hThread);
end;
end;
Могу ли я быть уверена, что не останусь в цикле навсегда ?
Или стоит предупредить близких, чтобы "не поминали лихом" ? :)
Tirael (2007-01-04 04:55:00) [21]а зачем PostThreadMessage и цикл?
просто
WaitForSingleObject(hThread, INFINITE);
ведь он же запустится когданить, а если что то BeginThread сама выбросит эксцепшн, ибо
BeginThread sets up an exception frame that allows the system's default exception handler to catch any of the thread's exceptions that have not been handled.
Riply (2007-01-04 04:21:00) [22]>[4] Джо © (04.01.07 03:20)
>Кажется, я неверно понял вопрос, сорри.
Это я плохо сформулировала :(
Попробую еще раз.
Нужно дождаться момента окончания "создания нити" и
начала выполнения кода в ее теле. Не знаю как еще сказать.
Я жду таким образом:
while not PostThreadMessage(ThreadID, REQUEST_EXISTS, 0, 0) do
if WaitForSingleObject(hThread, 1) <> WAIT_TIMEOUT then Exit;
Но опасаюсь зависнуть в этом цикле :(
Джо (2007-01-04 03:20:00) [23]Кажется, я неверно понял вопрос, сорри.
Джо (2007-01-04 03:18:00) [24]Самое простое, кажется — передавать ссылку на свою callback-процедуру, кою и вызывать, когда нужно.
Ученик чародея (2007-01-04 03:00:00) [25]Написать процедуру, которая проверяет какую-то "глобальную внутри объекта" флаговую переменную, отнимает значение времени от таймоута ожидания и делает между проверками Sleep(0) - передача неиспользованного кванта времени системе.
Riply (2007-01-04 02:46:00) [26]Извините, опять забыла выделить код :(