Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.029 c
14-1078484333
blackman
2004-03-05 13:58
2004.04.04
Добрые истории для детей


1-1079369751
Layner
2004-03-15 19:55
2004.04.04
Возможно ли в приложении скрыть / показать MainMenu?


14-1078672729
Nous Mellon
2004-03-07 18:18
2004.04.04
Электронный матриархат :)


8-1070004089
user
2003-11-28 10:21
2004.04.04
Как удалить определенное кол-во секунд из .wav файла


14-1078979847
Цветочек
2004-03-11 07:37
2004.04.04
Редактировать ключевое поле





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский