Главная страница
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.047 c
2-1132404304
начиннающий
2005-11-19 15:45
2005.12.11
Filter


14-1132231952
Andersen
2005-11-17 15:52
2005.12.11
Очередная загадка


4-1128934874
Vano85
2005-10-10 13:01
2005.12.11
Мониторинг за файлами


14-1132355247
Eraser
2005-11-19 02:07
2005.12.11
Знатокам алгоритмов сжатия, в частности, ZLib


14-1132632979
Separator
2005-11-22 07:16
2005.12.11
Закрытые и перенесеные посты