Страница 1 из 2
Параметры в поток
Добавлено: 11 июл 2006, 04:10
Evan
Здрасте
Как все таки передать параметр типа string в поток. Я уже перерыл много форумов но взазумительного ответа так и не нашёл.
В самой процедуре потока с переменной происходят какие-то метаморфозы то буквы последние исчезают, то меняются.
Добавлено: 11 июл 2006, 09:06
LAngel
передавай PСhar
Re: Параметры в поток
Добавлено: 11 июл 2006, 11:01
Blood_Magic
Evan писал(а):Здрасте
Как все таки передать параметр типа string в поток. Я уже перерыл много форумов но взазумительного ответа так и не нашёл.
В самой процедуре потока с переменной происходят какие-то метаморфозы то буквы последние исчезают, то меняются.
напиши поподробнее, с кусочками кода =)
Добавлено: 11 июл 2006, 11:47
Evan
LAngel писал(а):передавай PСhar
пробовал все равно
type
TThreadParam = record
Hdr : pchar] of char;
end;
PThreadParam = ^TThreadParam;
function .... : cardinal
var
ThParam : PThreadParam;
begin
GetMem(ThParam, sizeof(TThreadParam));
if ThParam <> nil then
begin
ThParam^.Header := Pchar(Header);
// переменная Header имеете тип string
//и не меняется во время выполнения
FillMemory(@ThParam^.Url, sizeof(ThParam^.Url), 0);
lstrcpy(ThParam^.Url, Pchar(Url));
CreateThread(nil, 0, @GetAsync, ThParam , 0, Result);
end;
end;
Добавлено: 11 июл 2006, 13:37
LAngel
А код самого потока?
передача верная.
Добавлено: 11 июл 2006, 16:33
Eugie
Evan, проблема в том, что ты передаешь в поток локальную переменную. К моменту использования она оказывается разрушена.
Короче, объявляй ThParam на уровне модуля или как статическую (const).
Добавлено: 11 июл 2006, 16:42
LAngel
Eugie, но память то выделяется,
не важно, локальная переменная указывает на кусок в памяти или глобальная...
имхо передача верная..
Добавлено: 11 июл 2006, 16:48
Eugie
Память-то выделяется, только переменная, которая на нее указывает, становится инвалидной по выходе из функции...
Добавлено: 11 июл 2006, 16:53
LAngel
В самой процедуре потока с переменной происходят какие-то метаморфозы то буквы последние исчезают, то меняются.
Значит надо в самой процедуре обращаться к параметру переданному в поток, а не к переменной

)
Код: Выделить всё
function GetAsync(param: PThreadParam): Integer; stdcall;
begin
param^.Header;
end;
Добавлено: 11 июл 2006, 16:59
Eugie
Дык, какая разница? Стек-то (т.е. его кусок - сама ThParam) все равно к моменту вызова GetAsync() оказывается порушенным.