Главная страница
    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.47 MB
Время: 0.049 c
11-1058782793
vitalMoya
2003-07-21 14:19
2004.04.04
Каталог из которого запущено приложение


14-1078481722
TUser
2004-03-05 13:15
2004.04.04
Параметры


1-1079261460
XPloit
2004-03-14 13:51
2004.04.04
XP Style в Delphi 8


1-1079475040
HPCOS
2004-03-17 01:10
2004.04.04
DLL...


1-1079438660
Незнающий
2004-03-16 15:04
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский