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

Вниз

как использовать CreateThread   Найти похожие ветки 

 
Stanislav ©   (2005-10-07 11:39) [0]

Есть процедура:
Procedure SuExecT (P:Pointer);
var CodTh:Cardinal;
begin
 if 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);
Но параметр не передается!
что я делаю не так?


 
Digitman ©   (2005-10-07 11:44) [1]

function SuExecT (P:Pointer): Integer;
begin
..
end;

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


 
Stanislav ©   (2005-10-07 12:03) [2]

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


 
Stanislav ©   (2005-10-07 12:13) [3]

В объявлении процедуры дописал  Procedure SuExecT (P:Pointer); stdcall
Все заработало.
Спасибо!


 
Leonid Troyanovsky ©   (2005-10-07 12:32) [4]


> Stanislav ©   (07.10.05 12:13) [3]
> В объявлении процедуры дописал  Procedure SuExecT (P:Pointer);
>  stdcall
> Все заработало.


Не все.

--
Regards, LVT.


 
Stanislav ©   (2005-10-07 12:39) [5]

Leonid Troyanovsky ©   (07.10.05 12:32) [4]

почему?
что еще нужно?
Подскажите если не сложно.


 
isasa ©   (2005-10-07 12:48) [6]

Если используешь, все-таки, CreateThread, то

...
IsMultithread:=true;
CreateThread(nil,0,@SUExecT,Pointer(ARM),0,TID);
...


 
Leonid Troyanovsky ©   (2005-10-07 12:52) [7]


> Stanislav ©   (07.10.05 12:39) [5]

> что еще нужно?


См.  Digitman ©   (07.10.05 11:44) [1]

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

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

--
Regards, LVT.


 
Digitman ©   (2005-10-07 13:05) [8]


> что еще нужно?


еще нужно понять. что ShowMessage - процедура не потокобезопасная
используй MessageBox()

а еще следует уяснить, что вызывать GetExitCodeThread() в коде того самого потока, который еще работает и который, собственно, и формирует в ходе своей работы этот ExitCode, по меньшей мере бессмысленно ...

вот этого

function SuExecT (P:Pointer): Integer;
begin
..
 Result := код возврата;
end;

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

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


 
Stanislav ©   (2005-10-07 13:23) [9]

ShowMessage - для отладки.
Все понятно, спасибо!
Иду исправлять.


 
Stanislav ©   (2005-10-07 16:24) [10]

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


 
Leonid Troyanovsky ©   (2005-10-07 16:37) [11]


> Stanislav ©   (07.10.05 16:24) [10]

> То чтобы получить H нужно ведь дождатся окончания выполнения
> этого процесса.


H - это хендл объекта ядра "поток", возвращается сразу
(т.е., независмо от дальнейшей судьбы запущенного потока).

Для того, чтобы узнать результат работы потока, т.е., то,
что возвращает функция потока, нужен GetExitCodeThread,
в котором H - первый параметр.

Когда же оный хендл стал ненадобен, ему делают CloseHandle.

--
Regards, LVT.


 
Stanislav ©   (2005-10-07 16:47) [12]

Понял.Спасибо. Вот еще вопрос я в цикле запускаю несколько паралельных потоков, а после завершения последнего мне нужно закрыть программу, как узнать когда он завершиться ?


 
Leonid Troyanovsky ©   (2005-10-07 16:58) [13]


> Stanislav ©   (07.10.05 16:47) [12]
> Понял.Спасибо. Вот еще вопрос я в цикле запускаю несколько
> паралельных потоков, а после завершения последнего мне нужно
> закрыть программу, как узнать когда он завершиться ?


WaitForMultipleObjects with bWaitAll = TRUE.

Если первичный поток VCL, то лучше ожидать MsgWaitForMultipleObjects,
чтобы не замораживать форму.

--
Regards, LVT.


 
Stanislav ©   (2005-10-07 17:11) [14]

Спасибо!
Если первичный поток VCL - нет.



Страницы: 1 вся ветка

Текущий архив: 2005.12.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.053 c
6-1125535648
DeathLess
2005-09-01 04:47
2005.12.11
Скачать файл с докачкой


4-1128578223
Stanislav
2005-10-06 09:57
2005.12.11
Как узнать имя компьютера?


2-1132743597
Василий927
2005-11-23 13:59
2005.12.11
OnActivate/OnDeactivate не работают?


3-1130134593
Zhekson
2005-10-24 10:16
2005.12.11
как скопировать все записи базы изменив один параметр?


1-1132043842
auz
2005-11-15 11:37
2005.12.11
TProgressBar - (Delphi6+NT4) vs (Delphi7+WinXP)