Страница 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, но память то выделяется,

Код: Выделить всё

GetMem(ThParam, sizeof(TThreadParam));
не важно, локальная переменная указывает на кусок в памяти или глобальная...

имхо передача верная..

Добавлено: 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() оказывается порушенным.