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

Вниз

Vlojennie Thread   Найти похожие ветки 

 
euge   (2002-12-11 01:58) [0]

Hi All

Sozdau thread v glavnoi programe, a potom iz sozdannogo threada sozdau eshe odi, peredau parametr lpParameter i prinimau ego vo vtorom threade, no ne mogu s nim rabotat", oshibka pamiat".

v chem proble, ne podskajit li vseznausheiu ALL.

procedure ThreadMain(lpParameter : LPDWORD); stdcall;
procedure OnePipe(lpParameter : LPDWORD); stdcall;

procedure OnePipe(lpParameter : LPDWORD);
var
hPipe : DWORD;
begin
hPipe := lpParameter^; //I have an error here?
c := #0;
while (c <> "i") do
begin
ReadFile(hPipe, c, 1, dwRead, nil);
if (dwRead > 0) and (c <> "") then Form1.Caption
:= Form1.Caption + c;
end;
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
end;

procedure ThreadMain(lpParameter : LPDWORD);
var
err : boolean;
hPipe : DWORD;
begin
hPipe := CreateNamedPipe("\\.\pipe\hi",
PIPE_ACCESS_INBOUND, PIPE_WAIT, PIPE_UNLIMITED_INSTANCES,
256, 256, 0, nil);
err := ConnectNamedPipe(hPipe, nil);
lpParameter := @hPipe;
CreateThread(nil, 0, @OnePipe, @hPipe, 0, lpThreadId);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
lpParameter : LPDWORD;
hPipe : DWORD;
begin
CreateThread(nil, 0, @ThreadMain, lpParameter,
0, lpThreadId);
end;


 
Digitman   (2002-12-11 10:29) [1]

Время жизни лок.переменной hPipe равно времени жизни процедуры ThreadMain()

Время жизни процедуры ThreadMain() равно времени выполнения всех операторов в ее теле.

Оператор, вызывающий ф-цию CreateThread() в теле ThreadMain(), немедленно исполняется и после этого ThreadMain() завершается, убирая за собой "мусор", в т.ч. "уничтожая" лок.переменную hPipe (размещенную в стеке на время жизни ThreadMain).

После "уничтожения" лок.переменной hPipe обращаться к ней ни по адресу ни по значению не имеет смысла и опасно - переменная уже не существует.

В то же время вызов ф-ции
CreateThread(nil, 0, @OnePipe, @hPipe, 0, lpThreadId);
приводит к старту нового потока тек.процесса, и поточной ф-ции OnePipe() передается в кач-ве параметра адрес лок.переменной hPipe (которая перестанет существовать через тысячные доли секунды, почти сразу же за завершением выполнения CreateThread в теле ThreadMain)

Вложенный поток, получив управление в поточной ф-ции OnePipe(), первым делом пытается обратиться к параметру по его адресу

hPipe := lpParameter^; //I have an error here?

что и приводит к ошибке, ибо параметр уже не существует




Страницы: 1 вся ветка

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

Наверх




Память: 0.45 MB
Время: 0.01 c
1-86734
pet
2003-01-17 11:55
2003.01.27
Работа с ярлыком


14-87146
Mixerl
2003-01-10 13:47
2003.01.27
Help по MS XML 4.0


1-86873
Marsello
2003-01-20 08:37
2003.01.27
Базы данных InterBase


14-87147
Slayer
2003-01-10 13:36
2003.01.27
DelphiX


14-87053
Лёха2003
2003-01-05 14:51
2003.01.27
Создание ядра ОС





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский