Главная страница
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.046 c
8-1121002140
Дмитрий Белькевич
2005-07-10 17:29
2005.12.11
Быстрый сдвиг массива точек на дробное значение точек.


4-1128667534
Ji
2005-10-07 10:45
2005.12.11
Изменение текста на форме после ее отрисовки


2-1132688533
HeavyMaster
2005-11-22 22:42
2005.12.11
UpDown


1-1132124995
DEMs
2005-11-16 10:09
2005.12.11
Компонент TVirtualStringTree


6-1118743677
SaX
2005-06-14 14:07
2005.12.11
Существуют ли компоненты для работы с протоколом Jabber?