Главная страница
    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.034 c
2-1132644446
Студент Антон
2005-11-22 10:27
2005.12.11
Книги. Полезные и бесполезные.


14-1132568115
Pazitron_Brain
2005-11-21 13:15
2005.12.11
Кто ведет здоровый образ жизни?


14-1132401904
Иксик
2005-11-19 15:05
2005.12.11
Очень странная проблема


1-1132156397
markers
2005-11-16 18:53
2005.12.11
"Конец перетаскивания"


2-1132997350
jiurafgdfg
2005-11-26 12:29
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский