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

Вниз

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

 
JuryL ©   (2005-02-02 18:09) [0]

Добрый день, коллеги!
Наставьте на путь истинный, можно хорошим примером. Есть MDI-проект, содержащий несколько типов дочерних окон. Всё работает и почти всё устраивает, НО! Некоторые дочерние окна предназначены для поиска информации и формирования отчетов на экране. Хотелось бы организовать работу так, чтобы запуская такие длительные процедуры можно было окрыть (или активизировать) другое дочернее окно и в нем работать. Нужна многопоточность?
Но что-то никак не пойму как увязать MainWindow, ChildWindow и Thread. Или это пустая затея?
Спасибо.


 
Digitman ©   (2005-02-02 18:14) [1]


> Нужна многопоточность?


вовсе не обязательно.
смотря что творится в "длительных процедурах".
в ряде случаев достаточно оформить такие проц-ры в виде цикла (с достаточно короткими по времени итерациями), в каждой итерации которого кр.всего прочего безусловно выполнять хотя бы Application.Processmessages .. не лучшее конечно решение, но задачу таки решает.


 
JuryL ©   (2005-02-03 07:36) [2]

Когда циклы, то решение с Application.ProcessMessages я пробовал (на тестовых проектах). Работает. А если циклов нет? Например, запускается на DB-сервере процедура, обрабатывает данные или выполняет поиск чего-нибудь и т.п. Тогда Application.ProcessMessages и вставить-то некуда.


 
Digitman ©   (2005-02-03 08:05) [3]


> JuryL ©   (03.02.05 07:36) [2]


> Например, запускается на DB-сервере процедура


если СУБД не поддерживает асинхронные вызовы, то тогда, разумеется, выход один - создание доп.потоков


 
JuryL ©   (2005-02-03 08:31) [4]

И... как?


 
Digitman ©   (2005-02-03 09:20) [5]


> JuryL ©   (03.02.05 08:31) [4]
> И... как?


что .. как ?


 
JuryL ©   (2005-02-03 09:35) [6]

какие-нибудь идеи и предложения есть?


 
Digitman ©   (2005-02-03 09:57) [7]


> JuryL ©   (03.02.05 09:35) [6]
> какие-нибудь идеи и предложения есть?


я не понял ..
ты не знаешь как создать трэд ? или что ?

проще уж некуда ..

MyThread := TMyThread.Create(...);


 
JuryL ©   (2005-02-03 09:57) [8]

мои сомнения вот в чём (по-простому):
дочерние формы - это массив форм, которым управляет главная форма, а тут еще и массив потоков получается, внутри каждого своя дочерняя форма (если я правильно вижу решение проблемы).
Кто всем этим будет управлять, что бы и MDI-интерфейс не развалился, и потоки работали, и....


 
Digitman ©   (2005-02-03 10:22) [9]


> JuryL ©   (03.02.05 09:57) [8]


> дочерние формы - это массив форм


на самом деле это список, а не массив .. ну допустим ..


> а тут еще и массив потоков получается


т.е. ты допускаешь при работе доч.формы запуск более чем одного доп.потока ? .. но ведь за создание/уничтожение этих потоков отвечает сама доч.форма !..

type

TMyChildForm = class(TForm)
..
 FThreads: TList;
 procedure DoOnThreadTerminated(Sender: TObject);
..
 procedure AfterConstruction; override;
 procedure BeforeDestruction; override;
..
 procedure StartNewThread;
end;
...

procedure TMyChildForm.AfterConstruction;
begin
 FThreads := TList.Create;
end;

procedure TMyChildForm.BeforeDestruction;
begin
 while FThreads.Count > 0 do
   TThread(List[0]).Free;
 FThreads.Free;
end;

procedure TMyChildForm.StartNewThread;
var
 MyThread: TMyThread;
begin
 MyThread := TMyThread.Create(True, ...);
 MyThread.OnTerminate := DoOnThreadTerminated;
 MyThread.Resume;
end;

procedure TMyChildForm.DoOnThreadTerminated(Sender: TObject);
begin
 with FThreads do
 Delete(IndexOf(Pointer(Sender)));
end;


 
Digitman ©   (2005-02-03 10:23) [10]

пардон ..

procedure TMyChildForm.StartNewThread;
var
MyThread: TMyThread;
begin
MyThread := TMyThread.Create(True, ...);
MyThread.OnTerminate := DoOnThreadTerminated;
FThreads.Add(MyThread);
MyThread.Resume;
end;


 
Erik1 ©   (2005-02-03 12:31) [11]

Можно и подругому, например создаеш поток который делает execute или Open, TDataSet компонентам можно организовать это последовательно. Тоесть пока отрабатываю компоненты первой формы остальные стоят и ждут. А только сообщаеш потоку какой DataSet обработать. Если DataBase неподерживает MultiThread операций, то все становится сложней, но тоже можно справится. Только придется создать свой коннест к базе внутри потока.


 
JuryL ©   (2005-02-03 13:03) [12]

Что касается ответа [9] от Digitman, то подразумевалось
одна дочерняя форма - один поток. Т.е. и вопрос-то был в этом:
в дочерней форме поток или в потоке форма? Вот.


 
Digitman ©   (2005-02-03 13:14) [13]


> в дочерней форме поток или в потоке форма?


ни то ни другое.
ибо формулировка некорректна хотя бы по сути.

давай отталкиваться от того, что форма (Ф) - это объект-наследник класса TForm, поток (П) в дан.случае - объект-наследник класса TThread .. и вопрос твой сводится к тому, вызов некоего метода какого из этих объектов должен приводить к созданию(уничтожению) другого объекта - то ли объект Ф создает/контролирует деятельность/уничтожает объект П (1), то ли наоборот (2)

пример приведен для случая (1), этот случай наиболее логичен


 
JuryL ©   (2005-02-03 13:45) [14]


> пример приведен для случая (1),


я не совсем понял, что такое случай 1

но если рассмотреть пример в [9] сообщении, то всё-таки создается форма, а уж в ней поток (потоки)....

Спасибо.


 
Digitman ©   (2005-02-03 13:48) [15]


> не совсем понял, что такое случай 1


объект Ф создает/контролирует деятельность/уничтожает объект П


> если рассмотреть пример в [9] сообщении, то всё-таки создается
> форма, а уж в ней поток (потоки)....


я и говорю - пример иллюстрирует как раз ЭТОТ случай


 
JuryL ©   (2005-02-03 14:41) [16]

тогда непонятно почему некорректна формулировка

> > в дочерней форме поток или в потоке форма?
>
> ни то ни другое.
> ибо формулировка некорректна хотя бы по сути.

всё-таки в форме поток.

Но не в этом дело. Напраление дальнейших действий понятно. Попробую.
Большое спасибо.



Страницы: 1 вся ветка

Текущий архив: 2005.02.20;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.045 c
14-1106769065
Oddin
2005-01-26 22:51
2005.02.20
Потдержка скинов


4-1105372682
dimonf
2005-01-10 18:58
2005.02.20
Работа с ИК от TV-тюнера!


1-1106985908
MakedoneZ
2005-01-29 11:05
2005.02.20
Как найти число дней в месяце и как очистить TImage.


1-1107872625
Stype
2005-02-08 17:23
2005.02.20
Директория Windows


3-1106644487
Lucifer
2005-01-25 12:14
2005.02.20
Ошибка синтаксиса From