Передача параметров при создании потока
Пользователи, просматривающие топик: 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;
|
|
|
RE: Передача параметров при создании потока - 2008-05-28 14:25:37.616666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Не совсем правильно. У тебя param - локальная переменная, создаётся на стеке. И уничтожится после того, как отработает TForm1.Button1Click. Получится твой поток уже не сможет к ней обратиться. Делай переменную так, чтобы её время жизни было наверняка дольше времени жизни потока. Например во внешнем классе.
|
|
|
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; ничего не изменилось.
|
|
|
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
|
|
|
RE: Передача параметров при создании потока - 2008-05-29 20:12:24.593333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Чем это BeginThread лучше CreateThread? И зачем так извращаться, чтобы передать всего один указатель?
|
|
|
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 и почему нужна куча, а не просто глобальные переменные, вот этого в толк взять не могу. ведь доступ к глобальным переменным всё равно есть у всех потоков, и по завершении процедуры поток сам по себе завершит работу. я не прав?
|
|
|
|
|