|
Вопрос # 3 892/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Есть 5 потоков описанных в отдельном модуле проекта.
Мне необходимо их запускать из основного окна приложения и на время выполнения потока показывать форму с проогрессбаром.
Как это лучше всего реализовать?
 |
Вопрос задал: Сидаровский Георгий (статус: Посетитель)
Вопрос отправлен: 16 марта 2010, 11:27
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Сидаровский Георгий!
Для начала читаем мою статью Скачиваем файлы из интернета и разбираемся, как делать посылку сообщений между потоками.
Потом. Для прогресса создаем свое собственное окно, его создаем перед созданием потоков. А потокам передаем хендл. и пусть они шлют, что нужно.
Но есть только одно маленькое "но". Если потоки будут сильно много слать сообщений, то главное окно будет выглядить заторможенным. то есть, потоки уже выполнят свою задачу, а прогресс будет перерисовываться. Просто надо меньше слать.
Если надо 5 прогрессов отображать и в добавок показывать кучу текста - указанная методика будет работать.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 16 марта 2010, 11:41
Оценка за ответ: 4
Комментарий к оценке: Всего 1 поток будет запускаться за раз.
Я бы хотел запускать поток из окна с прогресбаром.
Можно ли как то передавать окну название потока которрый нужно запустить?
|
Мини-форум вопроса
Всего сообщений: 9; последнее сообщение — 17 марта 2010, 17:53; участников в обсуждении: 3.
|
Вадим К (статус: Академик), 16 марта 2010, 13:02 [#1]:
Странно, почему 4... никто не мешает Вам запускать поток оттудова, откуда хочеться, главное, что бы окно с прогрессом было создано раньше (иначе при старте не получиться передать хендл на окно, но кто мешает его передать потом?).
Но что такое "передать название потока"?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Сидаровский Георгий (статус: Посетитель), 16 марта 2010, 13:12 [#2]:
Думаю я неправильно выразился.
Есть несколко потоков
Tread1:=TMyTread1;
Tread2:=TMyTread2;
Tread3:=TMyTread3;
Хотелось бы запускокать нужный поток в нутри frmProgress примерно так
..
begin
frmProgress:= TfrmProgress.Create(Self,'Вот здесь название потока ');
frmProgress.ShowModal;
frmProgress.Free;
end;
|
|
Вадим К (статус: Академик), 16 марта 2010, 13:56 [#3]:
ну... кто же так пишет.
Для начала, надо написать свой новый конструктор, он должен выглядеть где то так.
type
TThreadClass = class of TThread; //объявление метакласса:)
//...
//это объявление формы
public
constructor Create(aOwner:TComponent; myThread:TThreadClass);reintroduce; overload;
первое ключевое слово говорит, что мы переопределяем сигнатуру, а второе - что перекрываем метод.
и реализация
constructor Create(aOwner:TComponent; myThread:TThreadClass);
var t:TThread;
begin
//эта строка нужна, что бы форма корректно создалась
// мы же не хотим писать ручками весь конструктор формы?
inherited Create(aOwner);
//работаем с тредом
t := myThread.Create(...);
t.resume; //и так дальше
//t - это тип класса, а не просто переменная
end;
вызывать этот код надо где то так
frmProgress:= TfrmProgress.Create(Self, TMyTread1);
Если ничего не ошибся, должно все заработать.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 16 марта 2010, 19:43 [#4]:
Цитата (Вадим К):
Если ничего не ошибся, должно все заработать.
overload - это лишнее.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Сидаровский Георгий (статус: Посетитель), 17 марта 2010, 11:36 [#5]:
То что нужно!! Проблема изначально была в описании второго параметра конструктора.
Подскажите немного почему нельзя
вместо myThread:TThreadClass
обьявить myThread:TThread?
Почему приходится использовать эту строку?
type
TThreadClass = class of TThread; //объявление метакласса
|
|
Вадим К (статус: Академик), 17 марта 2010, 11:45 [#6]:
Потому что мы хотим, что бы форма с прогрессом создавала тред самостоятельно. А для этого ей нужно знать тип. А тип можно передать только через метакласс. или придется городить большой case, куда вписывать все возможные типы.
Или третий вариант - тред создавать ещё до создания формы прогресса, а ей передавать указатель на готовый объект.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Сидаровский Георгий (статус: Посетитель), 17 марта 2010, 17:29 [#7]:
Да про третий вариант я тоже думал но не нашол информации никакой как через указатель работать с потоками.
Спасибо что рассказали поро метакласс до этого незнал.
|
|
Сидаровский Георгий (статус: Посетитель), 17 марта 2010, 17:31 [#8]:
Ну а с case некрасиво просто получается.
|
|
Вадим К (статус: Академик), 17 марта 2010, 17:53 [#9]:
Цитата (Сидаровский Георгий):
нашЕл информации никакой как через указатель работать с потоками
А зачем указатели? просто передается имя объекта. он фактически является указателем. То есть можно объявить функцию вида
function foo (bar:TThread);
begin
bar.resume;
end;
//...
var t:TThread;
//...
t := TThread.Create;
foo(t);
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|