![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CreateThread и метод класса [D5, D7, Win2k]
Dust © (2005-07-12 12:03:00)CreateThread требует получить указатель на функцию и ни в каком виде не хочет принимать метод класса, а именно
procedure TClientSocket.DoLoop();
DoLoop - метод
-----
даже если написать так -
type ptoctype = Procedure();
var prctp : ptoctype;
то
никак не удастя сделать следующее присвоение -
prctp:=DoLoop;
А потому мне пришлось сделать функцию-обёртку, только для вызова одного метода.
Как вы поступали в таких ситуациях? Существует ли другой выход?
begin...end (2005-07-12 13:04:00) [21]> Dust © (12.07.05 12:03)
Если параметров нет (и внутри метода не используется Self -- явно или неявно), то всё просто.
type
TMyForm = class(TForm)
...
private
procedure M;
end;
var
Id, H: Cardinal;
procedure TMyForm.Button1Click(Sender: TObject);
type
TObjProc = procedure of object;
TProc = procedure;
var
OP: TObjProc;
P: TProc;
begin
OP := M;
P := TMethod(OP).Code;
H := CreateThread(nil, 0, @P, nil, 0, Id);
Win32Check(H <> 0)
end;
procedure TMyForm.M;
begin
Application.MessageBox('Ура, товарищи!', 'Ура!')
end.
P.S. CreateThread выкинуть. Использовать BeginThread.
Alex Konshin (2005-07-12 13:03:00) [22]Кстати, используй BeginThread вместо CreateThread.
Юрий Зотов (2005-07-12 13:01:00) [23]> CreateThread требует получить указатель на функцию и ни в
> каком виде не хочет принимать метод класса
Что и естественно. Методы классов имеют еще один (неявный) параметр (Self) - и, таким образом, получается несовпадение числа параметров.
> Существует ли другой выход?
CreateThread, среди прочих параметров, принимает указатель на данные пользователя, а затем передает его функции потока. Если через этот указатель передать экземпляр объекта, то функция потока сможет его использовать - в том числе, вызывать его методы.
Только тут надо быть аккуратным - вызывать метод объекта из другого потока можно лишь если этот метод потокобезопасен.
(2005-07-12 12:07:00) [24]Удалено модератором