Текущий архив: 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.48 MB
Время: 0.038 c