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

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

Функция в потоке не видит членов своего класса? [D5, Win2k]


AlexanderK2 ©   (2002-09-02 16:30:00) 

Создаю поток, используя вызов:
CreateThread(Nil, 0, @TForm1.myFunc, Nil, 0, myT);

объявление в классе:
procedure myFunc(); StdCall;

Работает прекрасно, НО:
myFunc не видит членов своего класса.

Form1.Button1.Caption - так работает
Button1.Caption - так нет.

PS. Без потока все видит.

Дело в том, что в C++Builder все работает.
В C++Builder все просто:
объявляю член класса
static DWORD WINAPI myFunc(LPVOID pMe);
точно такой же вызов

hTr=NULL; // Дескриптор потока
SA = new SECURITY_ATTRIBUTES; // Определение атрибутов потока
SA->bInheritHandle = true;
SA->lpSecurityDescriptor = NULL;
SA->nLength = sizeof(SA);

lpTheadid = new DWORD;
lpStartAddress = myFunc; // потоке

hTr = CreateThread(SA, 0, lpStartAddress, this, 0, lpTheadid);


и тоже самое работает замечательно. А вот как можно сделать это в Delphi?


AlexanderK2   (2002-09-02 18:10:00) [1]

Спасибо, получилось.
Надо было просто спросить паскалевский эквивалент this.

PS. Я пробовал работать с TThread, получилось и работало. Но вот работало плохо, а именно наблюдалось приторамаживание. Лучше чем вообще без потока, но все равно заметно, а вот в этом варианте все ОК!

Еще раз спасибо.


Старый Паскалист   (2002-09-02 17:40:00) [2]

Но в твоей конфигурации:
CreateThread(Nil, 0, @TForm1.myFunc,

{Nil} Self //- сюда идёт параметр, который затем будет
// передан ф-и потока. Поток её рассматривает, естественно,
// как procedure myFunc(Param: Integer); StdCall;
// И Self должен быть ей передан явно
// Кстати, в сишном варианте так и делается.

, 0, myT);

PS Вообще-то в Дельфях принято работать с потоками с помощью
TThread.

PPS Вызывать напрямую CreateThread Рихтер не советует.
Обычно при создании потока требуется некоторая инициализация
обработки исключений, RTL и чего-то подобного.

В дельфи на этот случай есть ф-я BeginThread (там - учти - тебуется ф-я fastcall).


Наверх

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