Параметры в поток

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Evan
Сообщения: 13
Зарегистрирован: 11 июл 2006, 03:42

Здрасте
Как все таки передать параметр типа string в поток. Я уже перерыл много форумов но взазумительного ответа так и не нашёл.
В самой процедуре потока с переменной происходят какие-то метаморфозы то буквы последние исчезают, то меняются.
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

передавай PСhar
С уважением, Lost Angel...
Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

Evan писал(а):Здрасте
Как все таки передать параметр типа string в поток. Я уже перерыл много форумов но взазумительного ответа так и не нашёл.
В самой процедуре потока с переменной происходят какие-то метаморфозы то буквы последние исчезают, то меняются.
напиши поподробнее, с кусочками кода =)
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
Evan
Сообщения: 13
Зарегистрирован: 11 июл 2006, 03:42

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;
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

А код самого потока?
передача верная.
С уважением, Lost Angel...
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Evan, проблема в том, что ты передаешь в поток локальную переменную. К моменту использования она оказывается разрушена.
Короче, объявляй ThParam на уровне модуля или как статическую (const).
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

Eugie, но память то выделяется,

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

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

имхо передача верная..
С уважением, Lost Angel...
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Память-то выделяется, только переменная, которая на нее указывает, становится инвалидной по выходе из функции...
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

В самой процедуре потока с переменной происходят какие-то метаморфозы то буквы последние исчезают, то меняются.
Значит надо в самой процедуре обращаться к параметру переданному в поток, а не к переменной :) )

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

function GetAsync(param: PThreadParam): Integer; stdcall;
begin
  param^.Header;
end;
С уважением, Lost Angel...
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Дык, какая разница? Стек-то (т.е. его кусок - сама ThParam) все равно к моменту вызова GetAsync() оказывается порушенным.
Ответить