![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CreateThread(nil,0,@MyProcedure,0,0,nil);
Tolik © (2006-01-19 21:22:00)Как передать свои параметры п процедуру?
например CreateThread(nil,0,@MyProcedure(1,1,2),0,0,nil); ?
Tolik (2006-01-19 22:57:00) [1]А как можно узнать hThread для определенного потока,если таковых запущено несколько?
Tolik (2006-01-19 22:39:00) [2]Спасибо огромное!!!! Просто под конец дня плохо соображается.Еще раз спасибо за то что терпеливо обьяснили :)
begin...end (2006-01-19 22:27:00) [3]> Tolik (19.01.06 22:23) [8]
> не трудно ли будет сказать,как сделать Param глобальной
Вынести за пределы обработчика Button1Click, очевидно. Вот сюда:
var
th1, th2: cardinal;
h1, h2: integer;
Param: TParam;
hThread: Cardinal;
Tolik (2006-01-19 22:23:00) [4]Кхе,следствие зашло в тупик:)
var
Form1: TForm1;
implementation
{$R *.dfm}
var
th1, th2: cardinal;
h1, h2: integer;
type
PParam = ^TParam;
TParam = record
First, Second, Third: Integer
end;
function MyFunction(P: Pointer): Integer;
var
Data: TParam;
i:integer;
begin
Data := PParam(P)^;
Result := Data.First;
for i:=0 to result do
begin
Form1.Memo1.Lines.Add(IntToStr(i));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Param: TParam;
hThread, ThreadId: Cardinal;
begin
Param.First := 100;
Param.Second := 1;
Param.Third := 2;
hThread := BeginThread(nil, 0, @MyFunction, @Param, 0, ThreadId);
end;
не трудно ли будет сказать,как сделать Param глобальной
begin...end (2006-01-19 22:19:00) [5]> Tolik (19.01.06 22:13) [5]
Во-первых, поскольку используете BeginThread, то соглашение о вызове функции MyFunction должно быть другим (уберите stdcall).
Во-вторых, я же ясно сказал в [1], что Param не должна удаляться из памяти. А Вы сделали её локальной переменной обработчика -- как только BeginThread запустит поток, обработчик завершится, и переменная Param перестанет существовать.
Tolik (2006-01-19 22:14:00) [6]На мемо выходит переменная i,которая равна 100.Так на мемо выходит то 106 то 110 то 115.Почему так?
Tolik (2006-01-19 22:13:00) [7]Наверно тоже понадобится
type
PParam = ^TParam;
TParam = record
First, Second, Third: Integer
end;
и код батонаprocedure TForm1.Button1Click(Sender: TObject);
var
Param: TParam;
hThread, ThreadId: Cardinal;
begin
Param.First := 100;
//Param.Second := 1;
//Param.Third := 2;
hThread := BeginThread(nil, 0, @MyFunction, @Param, 0, ThreadId);
end;
begin...end (2006-01-19 22:12:00) [8]> Tolik (19.01.06 22:11) [3]
Не понял, в чём проблема. Зато вижу обращение к VCL из неосновного потока.
Tolik (2006-01-19 22:11:00) [9]Интересная штука получилась
function MyFunction(P: Pointer): Integer; stdcall;
var
Data: TParam;
i:integer;
begin
Data := PParam(P)^;
Result := Data.First;
for i:=0 to result do
begin
Form1.Memo1.Lines.Add(IntToStr(i));
// Теперь в Data скопированы данные,
// указатель на которые был передан в функцию }
end;
end;
Каждый раз запускаешь и каждый раз новый результат получается.Интересно,это почему
begin...end (2006-01-19 21:52:00) [10]> вторая может быть использована для получения кода его завершения
Сорри, это я погорячился -- для этого Id напрямую использован быть не может. Но если идентификатор будет нужен для иных целей, "предостережение" остаётся в силе.
> Если её случится...
Если это случится...
P.S. Да, preview бы не помешал...
begin...end (2006-01-19 21:42:00) [11]> Tolik (19.01.06 21:22)
type
PParam = ^TParam;
TParam = record
First, Second, Third: Integer
end;
function MyFunction(P: Pointer): Integer; stdcall;
var
Data: TParam;
begin
Data := PParam(P)^;
// Теперь в Data скопированы данные,
// указатель на которые был передан в функцию
...
Result := ...;
end;
var
Param: TParam;
hThread, ThreadId: Cardinal;
begin
Param.First := 1;
Param.Second := 1;
Param.Third := 2;
hThread := CreateThread(nil, 0, @MyFunction, @Param, 0, ThreadId);
...
end
Переменная Param не должна удаляться из памяти во время работы потока. Если её случится (например, при выходе из подпрограммы, в которой она объявлена), её адрес станет недействительным, и попытка обратиться к данным по этому адресу внутри поточной функции приведёт к ошибке. Впрочем, это же касается и переменных hThread и ThreadId -- первая из них потребуется для закрытия хэндла потока, а вторая может быть использована для получения кода его завершения.
И ещё: уж сколько раз твердили миру -- используйте BeginThread вместо CreateThread. Почему -- см. справку по BeginThread.