Вниз
Скачать: CL | DM;

CreateThread-совместное использование кода   Найти похожие ветки 

← →
rimd   (2005-01-30 12:28) [0]

Возникла проблемма при использовании CreateThread, в качестве стартового адреса указал адрес функции, но проблемма в том, что нужно запустить несколько НИТЕЙ, которые используют одну и ту же функцию. Как избежать совместного использования локальных переменных этой функции?


← →
default ©   (2005-01-30 12:31) [1]

у каждого потока есть своя локальная память до которой другим потокам нет доступа
так вот локальные переменные размещаются как раз в такой памяти


← →
GuAV ©   (2005-01-30 12:42) [2]

... и эта самая локальная память называется "стэк потока".


← →
Максим   (2005-01-30 12:42) [3]

Тогда как объяснить:
function ThreadProc(lpVoid:Cardinal):Cardinal
var
 peremen:Cardinal;
begin
// Какой-то код
end;

for i:=0 to n do
begin
CreateThread(nil,0,@ThreadProc,nil,0,TPData[i].id);
//сдесь ждем к примеру пол секунды
end;

Первый поток (i=0) изменяет переменную как ему надо, а последующие потоки используют эту переменную в своих целя, но как-то странно получается, что они все равны этой переменной.

Я же не просто так вопрос поднял! Реальная проблемма...


← →
GuAV ©   (2005-01-30 12:44) [4]


> Первый поток (i=0) изменяет переменную как ему надо, а
> последующие потоки используют эту переменную в своих
> целя


Эта переменная своя для каждого потока, именно потому что она локальная.


← →
default ©   (2005-01-30 12:45) [5]

в каких целях?
у них она своя


← →
Максим   (2005-01-30 12:54) [6]

Это конечно здорово, что у каждого потока свой стек, но результат на лицо...


← →
default ©   (2005-01-30 12:58) [7]

потоки взяли переменную на поруки:)


← →
Максим   (2005-01-30 13:09) [8]

Это точно


← →
Cobalt ©   (2005-01-30 14:28) [9]

2 Максим
А у тебя, случаем, переменная не указана, как константа с начальным значением?


← →
Максим   (2005-01-30 17:42) [10]

неа


← →
Cobalt ©   (2005-01-30 19:30) [11]

Вот так вот:
function ThreadProc(lpVoid:PCardinal):Longword;stdcall;



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.023 c
1-1109241872
zdn
2005-02-24 13:44
2005.03.13
Дополнительные параметры


1-1109668069
KIR
2005-03-01 12:07
2005.03.13
Вертикальные надписи в StringGrid


1-1109684833
qwerr
2005-03-01 16:47
2005.03.13
VBS -> Delphi


4-1107179861
TAHAT
2005-01-31 16:57
2005.03.13
Как приостановить выполнение функции, вызванной из DLL


4-1107122348
kvant
2005-01-31 00:59
2005.03.13
как узнать координаты иконок на рабочем столе?




   Наверх