|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как запустить поток для фрейма?
В отдельном модуле имею TfrUn = class(TFrame) в нём есть TMemo, в нём очень большой обработчик действий, которые в свою очередь оказывают влияние на другие элементы этого фрейма (Обработчик обрабатывает все изменения в TMemo, перебирает все строки при любом изминении). Но как таковой переменной в фрейме frUn: TfrUn; не объявляется.
В основном модуле есть pcProg: TPageControl; в нём динамически создаю страницу и объект типа TfrUn, вновь созданную страницу назначаю родителем для вновь созданного фрейма. Т. е. на каждой странице свой фрейм с TMemo у которой свои обработчики событий. И вот когда в TMemo много строк прога начинает тупить. Хочу для каждого вызова обработчика TMemo запускать поток. Вот мне и не снятся с ручника. Если запускать поток и в Execute вызывать этот обработчик, дак в фрейме конкретно переменной frUn нет и в модуле фрейма я не могу обратится к обработчику. А в основном модуле, где TPageControl, как сказать родителю что данный поток должен обрабатывать именно этот обработчик. В общем я упёрся. Помогите, люди добрые. |
#2
|
|||
|
|||
Уперся - потому что не понимаешь как это все работает внутри.
В принципе, никакой проблемы нет, за исключением синхронизации (тут надо смотреть "вглубь" задачи). В общем виде делается так. При создании экземпляра фрейм создает новый поток (ссылку на него можно сохранить в самом фрейме). При удалении - сначала останавливает поток и удаляет его. Сам код обработки - внутри потока. А вот сигнал на начало очередной обработки выдается обработчиком на фрейме. Вот скелет: Код:
unit MyFrame; uses MyThread; type TMyFrame = class(TFrame) ... FThread : TMyThread; constructo Create(AOwner : TComponent); override; destructor Destroy; override; ... procedure Memo1Change(Sender : TObject); end; ... constructo TMyFrame.Create(AOwner : TComponent); begin inherited; FThread := TMyThread.Create(True); // Create suspended FThread.Memo = Memo1; FThread.FreeOnTerminate := True; FThread.Resume; end; destructor TMyframe.Destroy; begin FThread.Terminate; FThread.WaitFor; inherited; end; procedure TMyFrame.Memo1Change(Sender : TObject); begin FThread.ProcessChanges := True; end; end. unit MyThread; type TMyThread = class(TThread) ... public Memo : TMemo; ProcessChanges : Boolean; constructor Create(CreateSuspended : Boolean); override; procedure Execute; override; end; ... constructor TMyThread.Create(CreateSuspended : Boolean); begin inherited; Memo := Nil; ProcessChanges := False; end; procedure TMyThread.Execute; begin While Not Terminated Do Begin If (Memo= Nil) Or (Not ProcessChanges) Then Sleep(500) Else Begin ProcessChanges := False; // Дадее твой код обработки ... End; End' end; |