Всем привет! Начал я значится учить ООП. Пробую написать программу с использованием ООП, и возник следующий вопрос: Есть объект (назовем А), который я планирую в дальнейшем использовать как законченый объект. Есть поток, который я планирую создавать, запускать, останавливать внутри объекта А. Внутри потока генерируются значения, которые нужно периодически передавать "наверх" в объект А при чем внутри критической секции так же созданной в объекте А (т.к. некоторые методы объекта А тоже должны будут выполнятся внутри этой критической секции). В случае с вложенными классами ответ видится простой: поток - вложенный класс объекта А и в нужный момент вызывает метод Add объекта A в котором прописаны Code: CriticalSection.Enter; StringList.add; CriticalSection.Leave; Внимание вопрос: Как бы Вы вышли из создавшейся ситуации, учитывая что Delphi 7 версии и вложенные классы в нем отсутствуют. Спасибо.
Если правильно понял суть вопроса, то в потоке создай поле, в котором будет храниться ссылка на главный обьект. То есть при создании потока из главного обьекта сразу заноси в него ссылку на самой обьект. Потом по этой ссылке можешь выполнять какие нибудь действия с обьектом из потока.
не получается таким образом, ведь мне нужно: Creator = class (TObject) public Thread1:Thread; //в этом месте компилятор еще не знает, о существовании класса Thread end; Thread = class (TThread) public a:Creator; end; Ну а если объявление Thread перенести выше, то комплятор не знает класса Creator
Пишите так: Code: [B]Creator = class;[/B] Thread = class(TThread) public a: Creator; end; Creator = class(TObject) public Thread1: Thread; end;
Code: [B]Creator = class;[/B] Thread = class(TThread) public a: Creator; //тут выдаст ошибку "Undeclared identifier Creator" end; Creator = class(TObject) public Thread1: Thread; //если поменять местами классы, то тут выдаст ошибку "Undeclared identifier Thread" end;
Попробуй создать в Delphi 7 новый проект. Далее над Code: TForm1 = class(TForm) но ниже раздела type напиши Code: Creator = class; Thread = class(TThread) public a: Creator; end; Creator = class(TObject) public Thread1: Thread; end; Только что проверил, все нормально компилируется.
Еще вопрос возник: как объекту передать ссылку на самого себя? В Java это делается при помощи ключевого слова this. А в Delphi?
Использование в программе классов еще не означает ООП (с) Этот твой класс утилитный, да еще и с наследованием от библиотечного. Помещать в него логику, или ссылки на "неутилитные" (т.е. реализующие логику программы) - дурная практика(небось все в Execute написал, ага?). У тебя сейчас класс А знает про класс Б, а класс Б знает про класс А, да еще и с указанием конкретных типов - получаем практически любовь до гроба. Куда проще 1(!) раз написать наследника от TThread, которому в конструктор передавать ссылку на метод который будет выполняться в потоке и все. Например в твоем классе А есть метод Foo который нужно вынести в поток, тогда var thread: TMyThread; ................. thread := TMyThread.Create(Foo) теперь метод Foo хоть и выполняется в отдельном треде, но имеет доступ к контексту класса А - к его полям, методам и т.д. И даже не надо открывать к членам класса доступ - все можно оставить приватным. Вообще способ создания вторичных потоков в борланде придумали достаточно оригинальный, а многие дельфисты идут у них на поводу. Но вроде бы в ХЕ они "уже" исправились PS не сочтите за археологию, хотел ответить на этот пост еще при актуальности темы, но потом внезапно ушел в отпуск =)
Значится добрался до своего проекта, и возник следующий вопрос "Как передать ссылку на метод класса?": Code: TChecker = class private procedure Check; public .... procedure run; end; TCheckThread = class (TgsvThread) private Check:TProcedure; public protected constructor Create(Check:TProcedure); procedure Execute; override; end; procedure TChecker.Check; begin ..... end; При попытке написать CHK:=TCheckThread.Create(Check) выдает ошибку: [Error] Check.pas(308): Incompatible types: 'regular procedure and method pointer' Если же сделать Code: TChecker = class private Check:TProcedure; public .... procedure run; end; TCheckThread = class (TgsvThread) private Check:TProcedure; public protected constructor Create(Check:TProcedure); procedure Execute; override; end; procedure TChecker.Check; //то здесь выбивает ошибку (см ниже) begin ..... end; [Error] Check.pas(325): Declaration of 'Check' differs from previous declaration А если сделать Code: TChecker = class private Check:TProcedure; public .... procedure run; end; procedure Check; begin ..... end; То можно TChecker.Check:=Check, но процедура Check, естественно, не знает ничего о полях и методах TChecker А так: Code: CH:=@TChecker.Check; CHK:=TCheckThread.Create(CH); Вылазит "Acces violation" при обращении к полям и методам класса (что опять же логично). Где я что упускаю? Delphi 7