Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

Ожидание окончания 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.032 c
6-1074683336
Winnet
2004-01-21 14:08
2004.04.04
Где найти документацию по TcpClient и TcpServer


1-1079632852
senya
2004-03-18 21:00
2004.04.04
Удаление компонентов в Run-Time


14-1079074549
Rentgen
2004-03-12 09:55
2004.04.04
(2*Pi*R*R)/Z*R...


14-1078704285
Soft
2004-03-08 03:04
2004.04.04
Фак Ю или жизнь программиста в Штатах.


3-1078162957
ceval
2004-03-01 20:42
2004.04.04
как сделать чтобы из программы можно было распечатать таблицы