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

Вниз

Поток&Mdi   Найти похожие ветки 

 
hooky-mars ©   (2002-05-10 19:19) [0]

Saluer!
Уменя есть програ мостроеная на MDI. Порожденая форма создаёт поток. Это поток помимо его действий должен обращаться к тому окну, которое его порадило, но вот задача как это сделать?!
Создаю поток так:
....
uses...,Unit3:
...
private
{ Private declarations }
Sin:TSintaks;
...
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if p then
begin
sin.Terminate;
sin.Free;
end;
Action:=caFree;
end;

procedure TForm2.RichEdit1Change(Sender: TObject);
begin
sin:=TSintaks.Create(true);
sin.Resume;
sin.Priority:=tpLower;
p:=true;
end;
Поток должен творить так
...
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, ComCtrls;

type
TSintaks = class(TThread)
private
{ Private declarations }
procedure Sintaks;
protected
procedure Execute; override;
end;

implementation
uses Unit2;
procedure TSintaks.Execute;
var
p:Pointer;
s,s1:String;
begin
s:=Form2.RichEdit1.Lines.Text;
p:=@S;
s1:=String(p^);
application.MessageBox(PChar(s1),"ss",MB_OK)
end;

Вот эта строчка: Form2.RichEdit1.Lines.Text;
неправильна т.к. за частую она не туда обращается.
Помагите!


 
hooky-mars ©   (2002-05-10 22:03) [1]

Ну так что? Никто незнает?!


 
MBo ©   (2002-05-11 14:44) [2]

слово Synchronize тебе ни о чем не говорит?
статью Кариха хоть почитай


 
Cobalt ©   (2002-05-11 15:16) [3]

Присоединяюсь к MBo © (11.05.02 14:44)
Еще добавь следующее, потому что у тебя может создасться несколько потоков
sin:=TSintaks.Create(true);
sin.FreeOnTerminate:=true;
sin.Resume;


> s,s1:String;
> begin
> s:=Form2.RichEdit1.Lines.Text;
> p:=@S;
> s1:=String(p^);
> application.MessageBox(PChar(s1),"ss",MB_OK)

И зачем такой изврат? адрес то один и тот же.


 
hooky-mars ©   (2002-05-11 17:21) [4]


> MBo

Synchronize - это когда поток останавливается и управление передаётся главному потоку, который и произведёт обновление.
Но это же не значит, что поток обратиться к тому же дочернему окну, что его запустило? Или я в чём - то ошибаюсь?


 
hooky-mars ©   (2002-05-11 17:23) [5]


> И зачем такой изврат? адрес то один и тот же.

А потому что выскакивали ошибки вот я и извращался как мог.


 
hooky-mars ©   (2002-05-11 17:29) [6]

Если я пишу так :
procedure TSintaks.Execute;
begin
Synchronize(Sintaks);
end;

procedure TSintaks.Sintaks;
var
p:Pointer;
s,s1:String;
begin
s:=Form2.RichEdit1.Lines.Text;
p:=@S;
s1:=String(p^);
application.MessageBox(PChar(s1),"ss",MB_OK);
end;

Но читает он не оттуда, как только я создаю другое окошко! Это же MDI.


 
hooky-mars ©   (2002-05-11 17:30) [7]

Это Synchronize ничего не решает!


 
MBo ©   (2002-05-11 17:38) [8]

решает, решает. Не игнорируй.

Заведи поле объекта thread типа tform и передавай в него вызвавшую форму после создания suspended потока, потом resume


 
Cobalt ©   (2002-05-11 18:02) [9]

А что это за форма - Form2? Где она создаётся?
Или нигде, или только в начале(Application.CreateForm(...)), или каждым новым дочерним окном. Разберись.


> MBo © (11.05.02 17:38)
Заведи поле объекта thread типа tform и передавай в него вызвавшую форму после создания suspended потока, потом resume

По моему, лучше в конструкторе передавать ему индекс дочерней формы и из потока обращаться через главную форму к дочерним (Children) по индексу. Надеюсь, что окно после TForm2.RichEdit1Change хоть пару сек будет, тогда Synchronyse заблокирует основной поток, и успеет сделать свое дело.


 
hooky-mars ©   (2002-05-11 18:04) [10]

Мне тут строчичку присоветовали

> sin.FreeOnTerminate:=true;
Только она недаёт созданный поток прикончить.

> MBo © (11.05.02 17:38)
> решает, решает. Не игнорируй.
>
> Заведи поле объекта thread типа tform и передавай в него
> вызвавшую форму после создания suspended потока, потом resume

Можно по подробнее? Я еще учусь."передавай в него
> вызвавшую форму " - это как?


 
hooky-mars ©   (2002-05-11 18:08) [11]


> Cobalt © (11.05.02 18:02)
> А что это за форма - Form2? Где она создаётся?
> Или нигде, или только в начале(Application.CreateForm(...)),
> или каждым новым дочерним окном. Разберись.

Form1.FormStyle:=fsMDIForm;
Form2.FormStyle:=fsMDIChild;

Из Form1 я могу создавать сколько мне надо Form2. Каждая форма может создавать поток, а дельше вы знаете.


 
hooky-mars ©   (2002-05-16 18:00) [12]


> По моему, лучше в конструкторе передавать ему индекс дочерней
> формы и из потока обращаться через главную форму к дочерним
> (Children) по индексу. Надеюсь, что окно после TForm2.RichEdit1Change
> хоть пару сек будет, тогда Synchronyse заблокирует основной
> поток, и успеет сделать свое дело.

Как с этими индексами работать?


 
hooky-mars ©   (2002-05-16 20:58) [13]


> hooky-mars © (16.05.02 18:00)
>
> > По моему, лучше в конструкторе передавать ему индекс дочерней
>
> > формы и из потока обращаться через главную форму к дочерним
>
> > (Children) по индексу. Надеюсь, что окно после TForm2.RichEdit1Change
>
> > хоть пару сек будет, тогда Synchronyse заблокирует основной
>
> > поток, и успеет сделать свое дело.
>
> Как с этими индексами работать?




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

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

Наверх




Память: 0.5 MB
Время: 0.016 c
6-88575
StelZ
2002-03-04 23:05
2002.05.27
Посылка сообщения определенному пользователю


1-88463
RaZEr
2002-05-16 06:00
2002.05.27
Как можно быстро поменять местами вкладки (TTabSheet)


1-88453
ГС ТОФ
2002-05-17 15:39
2002.05.27
Событие клавиатуры


1-88434
Бывалый
2002-05-17 12:11
2002.05.27
TAdvStringGrid - центрирование ячеек.


1-88438
Den_vrtz
2002-05-17 09:10
2002.05.27
Вопрос про глючный QuickReport.