Як використовувати CreateThread

Є процедура: Procedure SuExecT (P:Pointer); var CodTh:Cardinal; begin іf p<>nil then begin ShowMessage (IntToStr(Integer(P))); SuExecA (Integer(P),""); end; GetExitCodeThread (TID, CodTH); ExitThread(CodTH); end; Викликаю її так: Windows.CreateThread(nil,0,@SUExecT,Pointer(ARM),0,TID); Але параметр не передається! що я роблю не так?

functionSuExecT (P:Pointer): Integer; begin .. end;

Результат :=BeginThread(nil,0,@SUExecT, Pointer(ARM),0,TID);

У мене процедуру не передається, ARM:=550 а Integer(P) = 0.

чому? що ще потрібно? Підкажіть якщо не складно.

Якщо використовуєш все-таки CreateThread, то . IsMultithread:=true; CreateThread(nil,0,@SUExecT,Pointer(ARM),0,TID); .

Поясню, що "Результат :=" означає, що отримане потрібно зберігати як мінімум для CloseHandle.

Ну і прийнято перевіряти Результат <> 0.

ще треба зрозуміти. що ShowMessage - процедура не потокобезпечна використовуй MessageBox()

а ще слід усвідомити, що викликати GetExitCodeThread() у коді того самого потоку, який ще працює і який, власне, і формує в ході своєї роботи цей ExitCode щонайменше безглуздо.

function SuExecT (P:Pointer): Integer; begin .. Result := код повернення; end;

цілком достатньо і для коректного повернення результату (який інший потік після завершення цього потоку зможе прочитати з прим. GetExitCodeThread, поки хендл потоку існує) і для завершення роботи потоку . ExitThread зовсім не обов'язковий у дан.

кр.того, GetExitCodeThread() вимагає параметром не Id, а Handle потоку

ShowMessage - для налагодження. Все зрозуміло,дякую! Іду виправляти.

Я тільки не зрозумію якщо цей процес виконується паралельно, з основним, а я пишу H:= BeginThread(nil,0,@SUExecT, Pointer(ARM),0,TID); То щоб отримати H потрібно дочекатися закінчення виконання цього процесу.

> То щоб отримати H потрібно дочекатися закінчення виконання > цього процесу.

H - це хендл об'єкта ядра "потік", повертається відразу (тобто, незалежно від подальшої долі запущеного потоку).

Для того, щоб дізнатися результат роботи потоку, тобто, що повертає функція потоку, потрібен GetExitCodeThread, в якому H - перший параметр.

Коли ж цей хендл став непотрібним, йому роблять CloseHandle.

Зрозумів спасибі. Ось ще питання я в циклі запускаю кілька паралельних потоків, а після завершення останнього мені потрібно закрити програму, як дізнатися, коли він завершиться?

WaitForMultipleObjects with bWaitAll = TRUE.

Якщо первинний потік VCL, то краще очікувати на MsgWaitForMultipleObjects, щоб не заморожувати форму.

Дякую!Якщо первинний потік VCL- ні.