![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поток&Mdi [D6, Win95/98, Win2k]
hooky-mars © (2002-05-10 19:19:00)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-16 20:58:00) [1]
> hooky-mars © (16.05.02 18:00)
>
> > По моему, лучше в конструкторе передавать ему индекс дочерней
>
> > формы и из потока обращаться через главную форму к дочерним
>
> > (Children) по индексу. Надеюсь, что окно после TForm2.RichEdit1Change
>
> > хоть пару сек будет, тогда Synchronyse заблокирует основной
>
> > поток, и успеет сделать свое дело.
>
> Как с этими индексами работать?
hooky-mars (2002-05-16 18:00:00) [2]
> По моему, лучше в конструкторе передавать ему индекс дочерней
> формы и из потока обращаться через главную форму к дочерним
> (Children) по индексу. Надеюсь, что окно после TForm2.RichEdit1Change
> хоть пару сек будет, тогда Synchronyse заблокирует основной
> поток, и успеет сделать свое дело.
Как с этими индексами работать?
hooky-mars (2002-05-11 18:08:00) [3]
> Cobalt © (11.05.02 18:02)
> А что это за форма - Form2? Где она создаётся?
> Или нигде, или только в начале(Application.CreateForm(...)),
> или каждым новым дочерним окном. Разберись.
Form1.FormStyle:=fsMDIForm;
Form2.FormStyle:=fsMDIChild;
Из Form1 я могу создавать сколько мне надо Form2. Каждая форма может создавать поток, а дельше вы знаете.
hooky-mars (2002-05-11 18:04:00) [4]Мне тут строчичку присоветовали
> sin.FreeOnTerminate:=true;
Только она недаёт созданный поток прикончить.
> MBo © (11.05.02 17:38)
> решает, решает. Не игнорируй.
>
> Заведи поле объекта thread типа tform и передавай в него
> вызвавшую форму после создания suspended потока, потом resume
Можно по подробнее? Я еще учусь."передавай в него
> вызвавшую форму " - это как?
Cobalt (2002-05-11 18:02:00) [5]А что это за форма - Form2? Где она создаётся?
Или нигде, или только в начале(Application.CreateForm(...)), или каждым новым дочерним окном. Разберись.
> MBo © (11.05.02 17:38)
Заведи поле объекта thread типа tform и передавай в него вызвавшую форму после создания suspended потока, потом resume
По моему, лучше в конструкторе передавать ему индекс дочерней формы и из потока обращаться через главную форму к дочерним (Children) по индексу. Надеюсь, что окно послеTForm2.RichEdit1Changeхоть пару сек будет, тогдаSynchronyseзаблокирует основной поток, и успеет сделать свое дело.
MBo (2002-05-11 17:38:00) [6]решает, решает. Не игнорируй.
Заведи поле объекта thread типа tform и передавай в него вызвавшую форму после создания suspended потока, потом resume
hooky-mars (2002-05-11 17:30:00) [7]Это Synchronize ничего не решает!
hooky-mars (2002-05-11 17:29:00) [8]Если я пишу так :
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:23:00) [9]
> И зачем такой изврат? адрес то один и тот же.
А потому что выскакивали ошибки вот я и извращался как мог.
hooky-mars (2002-05-11 17:21:00) [10]
> MBo
Synchronize - это когда поток останавливается и управление передаётся главному потоку, который и произведёт обновление.
Но это же не значит, что поток обратиться к тому же дочернему окну, что его запустило? Или я в чём - то ошибаюсь?
Cobalt (2002-05-11 15:16:00) [11]Присоединяюсь к 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)
И зачем такой изврат? адрес то один и тот же.
MBo (2002-05-11 14:44:00) [12]слово Synchronize тебе ни о чем не говорит?
статью Кариха хоть почитай
hooky-mars (2002-05-10 22:03:00) [13]Ну так что? Никто незнает?!