Форум: "Начинающим";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];
Внизпотоки Найти похожие ветки
← →
авыф (2007-12-05 15:19) [0]Всем доброго дня.
Нужно сделать базовый класс, содержащий форму и поток. Т.е. форма будет одна и та же, а метод потока будет переопределятся. Так вообще можно? Допустим Execute потока вызывает какой-нибудь виртуальный метод формы, который потом и переопределяется. Подскажите, кто знает, а то я никогда с потоками дела не имел.
← →
авыф (2007-12-05 15:24) [1]Или так:
Надо сделать форму, переопределив метод, скажем Processing, которой, все это дело выполняется в потоке и на форме отображаются: текущее время, положение прогрессбара, в мемо выводится какая-то инфа - это уже надо инк. в предок. Эт. вообще реально?
← →
Palladin © (2007-12-05 15:29) [2]Type
TMyThreadClass=Class(TThread)
Private
m_theForm:TMyForm;
Protected
Procedure Execute; Override;
Public
Constructor Create(Suspended:Boolean;p_theForm:TMyForm);
End;
Constructor Create;
Begin
m_theForm:=p_theForm;
Inherited Create(Suspended);
End;
Procedure Execute;
Begin
m_theForm.MyThreadProc;
End;
вот только будет попа с попытками контролировать исполнение потока, придется заводить в форме потоко-безопасную переменную для сигнализирования тому же методу MyThreadProc дабы он завершила свою работу в случае, например, закрытия формы...
← →
Сергей М. © (2007-12-05 15:30) [3]
> Нужно сделать базовый класс, содержащий форму и поток
Это как ?
← →
Palladin © (2007-12-05 15:33) [4]
> все это дело выполняется в потоке и на форме отображаются:
> текущее время, положение прогрессбара, в мемо выводится
> какая-то инфа - это уже надо инк. в предок.
>
а с этим еще хуже, так как, сам понимаешь, TThread.Synchronize в методе формы доступен не будет
← →
авыф (2007-12-05 15:38) [5]
> а с этим еще хуже, так как, сам понимаешь, TThread.Synchronize
> в методе формы доступен не будет
Ну, а как-нибудь обойти-то можно? Если передать количество обрабатываемых записей. А по таймеру из Execute вызывать там SetDisplayText? Така можно?
← →
авыф (2007-12-05 15:39) [6]
> Сергей М. © (05.12.07 15:30) [3]
еще и кнопку туда хочу:)
← →
Palladin © (2007-12-05 15:46) [7]
> авыф (05.12.07 15:38) [5]
объясни, что ты хочешь делать в этом потоке? насколько я понял, виртуальный метод формы тебе нужен лишь для разных стилей отображения какой либо одной и той же работы?
← →
Kolan © (2007-12-05 15:48) [8]> Нужно сделать базовый класс
> Надо сделать форму
> еще и кнопку туда хочу:)
Не хочу я кнопку, хочу быть владычецей морскою.
← →
авыф (2007-12-05 15:49) [9]
> Palladin © (05.12.07 15:46) [7]
просто форма отображает течение какого-либо процесса, а вот сам алгоритм может быть каким угодно.
← →
Сергей М. © (2007-12-05 15:50) [10]
> еще и кнопку туда хочу
Да хоть скрепку канцелярскую)
Но сначала дай своё подробное толкование фразы "класс, содержащий форму и поток" ..
← →
Palladin © (2007-12-05 15:52) [11]
> авыф (05.12.07 15:49) [9]
то есть, грубо говоря, ты хочешь построить форму визуализации для отображения прогресса исполнения любого алгоритма?
← →
Григорьев Антон © (2007-12-05 15:53) [12]
> Palladin © (05.12.07 15:33) [4]
> а с этим еще хуже, так как, сам понимаешь, TThread.Synchronize
> в методе формы доступен не будет
Значит, в классе TMyForm нужно предусмотреть ссылку на создавший форму TThread, при создании формы правильно инициализировать эту ссылку, и вызывать через неё Synchronize из метода формы.
← →
Palladin © (2007-12-05 15:55) [13]
> Григорьев Антон © (05.12.07 15:53) [12]
это естественно, но сейчас подождем ответа на мой вопрос, может все можно сделать гораздо проще
← →
авыф (2007-12-05 15:55) [14]
> Palladin © (05.12.07 15:52) [11]
да
> Григорьев Антон © (05.12.07 15:53) [12]
можно на пальчиках?
← →
авыф (2007-12-05 15:57) [15]
> Сергей М. © (05.12.07 15:50) [10]
це класс унаследованный от TThread, одним из свойств которого, является наследник от TForm. А хошь наоборот. Пойде?
← →
Сергей М. © (2007-12-05 15:58) [16]
> и вызывать через неё Synchronize из метода формы
Метод Synchronize защищенный, его вызов возможен только в контексте методов класса-наследника TThread.
← →
авыф (2007-12-05 16:01) [17]Мне-то что делать?
← →
Сергей М. © (2007-12-05 16:02) [18]
> авыф (05.12.07 15:57) [15]
А зачем форме что-то знать про класс потока ?
← →
Kolan © (2007-12-05 16:08) [19]Сделай чтобы процесс был вне формы, а форма служила только для отображения. — Это выриант 1
Можешь использовать паттерн Visitor и передавть в форму посетителя, который и выполнит действия, а выводить прогресс будет в форму(он ей получит при запуске) — это вариант 2.
Я бы выбрал 2
← →
Palladin © (2007-12-05 16:12) [20]
> Сергей М. © (05.12.07 15:58) [16]
ну в принципе ни кто не мешает в классе потока его в public вытащить
> авыф (05.12.07 16:01) [17]
при таком раскладе форме действительно нафиг не нужно ничего знать о потоке... главное любому классу потока, который занимается определенной задачей, любой передать объект формы которая обладает заявленным функционалом, грубо говоря набором методов для визуализации прогресса, и уже в TThread.Execute алгоритм потока сам решает когда и какие методы формы использовать...
← →
Palladin © (2007-12-05 16:12) [21]о мля... где то b не закрыл...
← →
Сергей М. © (2007-12-05 16:14) [22]Судя по
> ты хочешь построить форму визуализации для отображения прогресса
> исполнения любого алгоритма?
> да
достаточно:
- объявить прототип некоего метода, который любой созданный тобой поток должен вызывать всякий раз, когда он хочет известить какой-либо другой объект (например, форму) о своих прогресс-изменениях.
- объявить и реализовать в классе формы метод с таким прототипом
- создать класс TXXXThread, предусмотрев в его конструкторе параметр, соответствующий вышеозначенному прототипу
- в ходе и работы метода TXXXThread.Execute в нужный момент вызывать переданный в конструкторе метод, при необходимости синхронизируя его вызов с осн.потоком, например, средствами метода Synchronize
← →
Сергей М. © (2007-12-05 16:15) [23]
> Palladin © (05.12.07 16:12) [20]
> ну в принципе ни кто не мешает в классе потока его в public
> вытащить
Никто. Но дурней затеи не придумать)
← →
Palladin © (2007-12-05 16:15) [24]:) эт точно
← →
авыф (2007-12-05 17:25) [25]Всем спасибо
← →
авыф (2007-12-06 12:27) [26]
> Можешь использовать паттерн Visitor и передавть в форму
> посетителя, который и выполнит действия, а выводить прогресс
> будет в форму(он ей получит при запуске) — это вариант 2.
>
Где бы почитать про Visitor"а и со-товарищи?
← →
авыф (2007-12-06 12:56) [27]Ну, посоветуйте же, что почитать про паттерны!
← →
Slym © (2007-12-06 13:33) [28]У меня есть компонентка самописная... Поточный прогресбар...
могу привести код... но длинный
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.006 c