Параметры в поток
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Здрасте
Как все таки передать параметр типа string в поток. Я уже перерыл много форумов но взазумительного ответа так и не нашёл.
В самой процедуре потока с переменной происходят какие-то метаморфозы то буквы последние исчезают, то меняются.
Как все таки передать параметр типа string в поток. Я уже перерыл много форумов но взазумительного ответа так и не нашёл.
В самой процедуре потока с переменной происходят какие-то метаморфозы то буквы последние исчезают, то меняются.
передавай PСhar
С уважением, Lost Angel...
-
- Сообщения: 273
- Зарегистрирован: 30 июн 2005, 14:53
напиши поподробнее, с кусочками кода =)Evan писал(а):Здрасте
Как все таки передать параметр типа string в поток. Я уже перерыл много форумов но взазумительного ответа так и не нашёл.
В самой процедуре потока с переменной происходят какие-то метаморфозы то буквы последние исчезают, то меняются.
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
пробовал все равно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;
А код самого потока?
передача верная.
передача верная.
С уважением, Lost Angel...
Evan, проблема в том, что ты передаешь в поток локальную переменную. К моменту использования она оказывается разрушена.
Короче, объявляй ThParam на уровне модуля или как статическую (const).
Короче, объявляй ThParam на уровне модуля или как статическую (const).
Eugie, но память то выделяется,
не важно, локальная переменная указывает на кусок в памяти или глобальная...
имхо передача верная..
Код: Выделить всё
GetMem(ThParam, sizeof(TThreadParam));
имхо передача верная..
С уважением, Lost Angel...
Память-то выделяется, только переменная, которая на нее указывает, становится инвалидной по выходе из функции...
Значит надо в самой процедуре обращаться к параметру переданному в поток, а не к переменнойВ самой процедуре потока с переменной происходят какие-то метаморфозы то буквы последние исчезают, то меняются.

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