Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.12;
Скачать: CL | DM;

Вниз

Функция в потоке не видит членов своего класса?   Найти похожие ветки 

 
AlexanderK2   (2002-09-02 16:30) [0]

Создаю поток, используя вызов:
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?


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

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

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

, 0, myT);

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

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

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


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

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

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

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



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

Текущий архив: 2002.09.12;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.015 c
3-35624
demisen
2002-08-23 10:58
2002.09.12
Mask в QuickReport


8-35818
darha
2002-05-06 23:52
2002.09.12
Программа


3-35613
Bubuka
2002-08-22 22:36
2002.09.12
RecordSet. обновить одну строку из набора данных


4-35944
Shur_ap
2002-07-21 17:19
2002.09.12
не закрывается приложение


3-35609
ShuraGrp
2002-08-22 16:28
2002.09.12
TDataSet.Open приводит к тому, что все поля Visible = false