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

Вниз

потоки   Найти похожие ветки 

 
авыф   (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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.017 c
9-1163886978
Vga
2006-11-19 00:56
2007.12.30
Паки в играх


15-1196340231
de.
2007-11-29 15:43
2007.12.30
Что это за хрень...


15-1196147650
em240
2007-11-27 10:14
2007.12.30
MsSql2000+транзакции


2-1196767896
Kolan
2007-12-04 14:31
2007.12.30
Как запретить авто удаление наследнику TInterfacedObject?


2-1197033931
Максим
2007-12-07 16:25
2007.12.30
Проверка