Форум: "Основная";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.067 c