Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1197017050
brother
2007-12-07 11:44
2007.12.30
быстрая выборка из кучи


2-1196675502
Alexandr Malygin
2007-12-03 12:51
2007.12.30
excel


15-1196412172
BAX
2007-11-30 11:42
2007.12.30
FastReport Server ?


11-1181762529
=BuckLr=
2007-06-13 23:22
2007.12.30
RE_FmtUnderlineStyle


15-1195868497
Duo
2007-11-24 04:41
2007.12.30
Как определить, что мышь над TToolButton.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский