Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
ВнизОжидание окончания Thread a. Найти похожие ветки
← →
Thomas Brandon (2004-03-11 22:12) [0]Уважаемый All, я уже голову сломал :-)
Постановка задачи:
Из некоей процедуры First вызывается другая процедура - Second.
В процедуре Second формируется нить (скажем, ExampleThread).
procedure First(Chtoto: Tip);
begin
Second;
exit;
end;
procedure Second;
var
ExampleThread: HWND;
begin
ExampleThread := BeginThread(...@procExampleThread...);
WaitForSingleObject(ExampleThread, Infinite);
end;
procedure procExampleThread;
begin
//Сложнейшие вычисления :-)
end;
Дело вот в чём: WaitForSingleObject не работает! Сразу после создания нити процедура Second заканчивается и управление передаётся процедуре First. Даже если принудительно задержать поток (к примеру, Sleep(10000)), всё равно Second заканчивается.
Что я не так делаю?
← →
Thomas Brandon (2004-03-11 22:44) [1]Кажется, это камень преткновения не только для меня...
← →
Курдль © (2004-03-11 22:52) [2]Я глянул описание приведенных Вами функций.
WaitForSingleObject принимает HANDLE.
Её рекомендовано использовать с CreateThread.
Может быть в этом дело?
← →
Thomas Brandon (2004-03-11 23:15) [3]
> Курдль
Так ведь и у меня ExampleThread типа HWND.
Компилятор не ругается, думаю, дело не в этом. Да и большой разницы между CreateThread и BeginThread я не вижу, разве что BeginThread безопаснее.
← →
Verg © (2004-03-11 23:21) [4]Вот непонятно как таким образом поучилось так, что procedure procExampleThread; имеет не тот прототип
Вот же какой в хелпе сказаноtype TThreadFunc = function(Parameter: Pointer): Integer;
А у тебя что?
Потом, какой результат возвращает WaitForSingleObject?
Ну, а если она заканчивается WAIT_FAILED, то надо бы посмотреть что скажет GetLastError.
> ExampleThread := BeginThread(...@procExampleThread...);
И уж приведи, не поленись, как можно более полный код. Что это за многоточия?
Ясно же тебе, наверное, что Wait.... НЕ МОЖЕТ НЕ работать. Значит ты что-то делаешь не так.
← →
Lena19 (2004-03-11 23:24) [5]я может не догоняю но какой смысл в нити если надо ждать ее завершения
← →
Verg © (2004-03-11 23:34) [6]
> [5] Lena19 (11.03.04 23:24)
Ну, например, когда к какому-то моменту времени главный поток может продолжать вычисления только основываясь на резултатах работы дополнительного. Но дополнительный к этому моменту времени просто мог еще не успеть закончить вычисления.
← →
Thomas Brandon (2004-03-11 23:36) [7]
> Lena19
Например, можно распараллелить вычисления.
> Verg
Мда... Надо было сразу вместо многоточий привести код.
Начал приводить код и сразу наткнулся на ошибку. Какой я невнимательный к вечеру!
Спасибо всем, пошел я в постель :-)
← →
Юрий Зотов © (2004-03-12 05:16) [8]> Thomas Brandon
При таком построении кода пропадает весь смысл второго потока:
procedure Second;
var
ExampleThread: HWND; // Почему HWND? Это не ошибка, но все же?
begin
ExampleThread := BeginThread(...@procExampleThread...);
WaitForSingleObject(ExampleThread, Infinite);
end;
procedure procExampleThread;
begin
//Сложнейшие вычисления :-)
end;
Получается: запустили второй поток и - тут же усыпили первый до завершения второго. И какой же в этом смысл? С совершенно тем же результатом можно было производить Ваши сложнейшие вычисления и в первом потоке.
Если Вашей целью было сохранить активность визуального интерфейса программы, то WaitForSingleObject в этом никак не поможет, надо использовать цикл ожидания с MsgWaitForMultipleObject и Application.ProcessMessages.
← →
TUser © (2004-03-12 07:02) [9]У класса TThread есть метод - WaitFor, но вообще-то - см [1]. Потоки пишутся для того, чтобы распараллелить вычисления, а не для того, чтобы основной поток кого-то ждал.
← →
TUser © (2004-03-12 07:02) [10]У класса TThread есть метод - WaitFor, но вообще-то - см [8]. Потоки пишутся для того, чтобы распараллелить вычисления, а не для того, чтобы основной поток кого-то ждал.
← →
Verg © (2004-03-12 09:51) [11]
> [8] Юрий Зотов © (12.03.04 05:16)
Я так понимаю, что приведенный автором обрывок кода был просто экспериментом по выявлению "неработоспособности" WaitFor.... :)
А вообще когда один поток (и не обязательно главный) начинает ждать завершения другого - это вполне нормальный случай. см. [6]
Тут главное - не получить взаимной блокировки (dead lock).
← →
Юрий Зотов © (2004-03-12 13:15) [12]> Verg © (12.03.04 09:51) [11]
> А вообще когда один поток (и не обязательно главный) начинает
> ждать завершения другого - это вполне нормальный случай. см.
> [6]. Тут главное - не получить взаимной блокировки (dead lock).
Благодарю за разъяснения. Теперь буду знать.
:о)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c