Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.039 c
1-1107807336
GGGG123123
2005-02-07 23:15
2005.02.20
Как узнать где находиться exe моей пргораммы при её работе?


1-1107721313
TheEd
2005-02-06 23:21
2005.02.20
Как "распечатать" отчёт в Excel евский шаблон *.xlt?


1-1107834997
Аккум
2005-02-08 06:56
2005.02.20
Динамический array of record в памяти как располагается ?


3-1106207476
Duka
2005-01-20 10:51
2005.02.20
Структура базы cds


1-1107847999
SergP.
2005-02-08 10:33
2005.02.20
SetSystemTime. Проблема с поясами...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский