Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.05.27;
Скачать: [xml.tar.bz2];

Вниз

Поток&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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.006 c
4-88683
BAHO
2002-02-22 05:27
2002.05.27
Триклятая функция...


3-88351
Roman_tutov
2002-04-19 16:56
2002.05.27
сортировка в dbGrid


1-88410
Lit_Bogdan
2002-05-17 00:06
2002.05.27
График типа DBChart


4-88693
CaSHe
2002-03-24 01:47
2002.05.27
Шрифты и API


1-88554
Ron
2002-05-16 15:05
2002.05.27
TEdit





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