Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CreateThread и метод класса [D5, D7, Win2k]


Страницы:   1 2

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]

Удалено модератором


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо