Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Передача параметров при создании потока

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Передача параметров при создании потока
Имя
Сообщение << Старые топики   Новые топики >>
Передача параметров при создании потока - 2008-05-26 02:01:55.020000   
weak spirit

Сообщений: 56
Оценки: 0
Присоединился: 2007-09-30 18:40:25.726666
и всё-таки, как грамотно передать параметры в CreateThread?
делаю так:
type TRecord = record id: Integer; key: Integer; end; function ThreadFunc(param: Pointer): Integer; var p: TRecord; begin [b] p := TRecord(param^); [/b] // здесь param равен nil MessageBox(0, PChar(IntToStr(p.id)), PChar(IntToStr(p.key)), MB_OK) end; procedure TForm1.Button1Click(Sender: TObject); const threadCount = 5; var threads: array [0..threadCount - 1] of THandle; i: Integer; param: TRecord; id: DWORD; begin for i := 0 to threadCount - 1 do begin param.id := i; param.key := random(100); [b]threads[i] := CreateThread(nil, 0, @ThreadFunc, @param, 0, id);[/b] end; end;
Post #: 1
RE: Передача параметров при создании потока - 2008-05-28 14:25:37.616666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Не совсем правильно. У тебя param - локальная переменная, создаётся на стеке. И уничтожится после того, как отработает TForm1.Button1Click. Получится твой поток уже не сможет к ней обратиться. Делай переменную так, чтобы её время жизни было наверняка дольше времени жизни потока. Например во внешнем классе.
Post #: 2
RE: Передача параметров при создании потока - 2008-05-29 00:29:19.106666   
weak spirit

Сообщений: 56
Оценки: 0
Присоединился: 2007-09-30 18:40:25.726666
или, например, просто глобальную переменную?
type TRecord = record id: Integer; key: Integer; end; var param: TRecord; function ThreadFunc(par: Pointer): Integer; var p: TRecord; begin p := TRecord(par^); // всё так же MessageBox(0, PChar(IntToStr(p.id)), PChar(IntToStr(p.key)), MB_OK) end; procedure TForm1.Button1Click(Sender: TObject); const threadCount = 5; var threads: array [0..threadCount - 1] of THandle; i: Integer; id: DWORD; begin for i := 0 to threadCount - 1 do begin param.id := i; param.key := random(100); threads[i] := CreateThread(nil, 0, @ThreadFunc, @param, 0, id); end; end; ничего не изменилось.
Post #: 3
RE: Передача параметров при создании потока - 2008-05-29 16:54:41.196666   
TurboXaker

Сообщений: 385
Оценки: 0
Присоединился: 2008-05-23 01:05:40.516666
используй BeginThread вместо CreateThread и вконце функции потока вставь ExitThread(0);
Если все же хочешь CreateThread параметр держи в куче (heap), для это используй HeapAlloc
Post #: 4
RE: Передача параметров при создании потока - 2008-05-29 20:12:24.593333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Чем это BeginThread лучше CreateThread? И зачем так извращаться, чтобы передать всего один указатель?
Post #: 5
RE: Передача параметров при создании потока - 2008-05-30 01:31:13.833333   
weak spirit

Сообщений: 56
Оценки: 0
Присоединился: 2007-09-30 18:40:25.726666

quote:

ORIGINAL: TurboXaker

используй BeginThread вместо CreateThread и вконце функции потока вставь ExitThread(0);
Если все же хочешь CreateThread параметр держи в куче (heap), для это используй HeapAlloc

да, BeginThread в сочетании с глобальными переменнами (раньше пробовал его, но с локальными переменными) помогает, спасибо. а вот зачем в конце ExitThread и почему нужна куча, а не просто глобальные переменные, вот этого в толк взять не могу. ведь доступ к глобальным переменным всё равно есть у всех потоков, и по завершении процедуры поток сам по себе завершит работу. я не прав?
Post #: 6
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Передача параметров при создании потока







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.