Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

как использовать 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.043 c
1-1131685235
Andrey V.
2005-11-11 08:00
2005.12.11
Internal error: L1496


5-1116228247
Николай
2005-05-16 11:24
2005.12.11
Создание компонента


1-1132078212
AntonXXX
2005-11-15 21:10
2005.12.11
Запуск процедуры из DLL при клике


2-1132488605
alexab
2005-11-20 15:10
2005.12.11
Использование for...to...do


2-1132812477
hed
2005-11-24 09:07
2005.12.11
Опредилить тип файла ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский