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

Вниз

Сообщения. Не знаю как подступиться.   Найти похожие ветки 

 
NewDelpher ©   (2004-10-15 09:17) [0]

Есть приложение в котором штук 50 объектов, наследованных от одного класса. Есть объект, который должен через определенные промежутки времени послылать всем этим объектам сообщение. А они, получив его, производят какие-нибудь действия.
Вот я и не знаю с чего начать? И как организовать такой обмен? Какие есть в Delphi инструменты?


 
KSergey ©   (2004-10-15 09:21) [1]

Массив ссылок на все объекты (тип - базовый класс). И в цикле пробегаемся - вот и все.


 
KSergey ©   (2004-10-15 09:22) [2]

А сообщения - именно натуральные сообщения или можно просто вызов некоего метода? Тогда заводим в базовом классе виртуальный абстрактный метод, в потомках - перкрываем, а дальше - тот же цикл с вызовом метода.


 
NewDelpher ©   (2004-10-15 09:24) [3]


> KSergey ©   (15.10.04 09:21) [1]
> Массив ссылок на все объекты (тип - базовый класс). И в
> цикле пробегаемся - вот и все.

нет, такой вариант не годится.


 
NewDelpher ©   (2004-10-15 09:25) [4]


> А сообщения - именно натуральные сообщения

да


 
KSergey ©   (2004-10-15 09:35) [5]

> [3] NewDelpher ©   (15.10.04 09:24)
> нет, такой вариант не годится.

Отчего же??


 
©   (2004-10-15 09:39) [6]

Ну и в чем проблемма. По моему о собственых сообщениях инфа
имеется в литературе. Да и они особо и не отличаются по обработке
от сообщений Win за исключением диапазона.


 
NewDelpher ©   (2004-10-15 09:49) [7]


> R ©   (15.10.04 09:39) [6]
> Ну и в чем проблемма. По моему о собственых сообщениях инфа
> имеется в литературе. Да и они особо и не отличаются по
> обработке
> от сообщений Win за исключением диапазона.

Поделись ссылками, а? :)

> KSergey ©   (15.10.04 09:35) [5]
> > [3] NewDelpher ©   (15.10.04 09:24)
> > нет, такой вариант не годится.
>
> Отчего же??


Надо, чтобы синхоронно всё было.


 
©   (2004-10-15 09:57) [8]

Вот пример класса обрабатывающего собственное сообщение.
unit CustomEdit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

 const
 MM_Beep={от}WM_User+100{до $7FFFF-диапазон собственных};
 type
 TCustomEdit1 = class(TCustomEdit)

 private
   { Private declarations }
 protected
   { Protected declarations }
 public
   { Public declarations }
   procedure MM_Message0(var Mes:TMessage);message MM_Beep ;
 published
   { Published declarations }
 end;

procedure Register;

implementation

procedure TCustomEdit1.MM_Message0(var Mes:TMessage);
begin
Beep;
Self.Text:="Mess MM_Beep"
end;

procedure Register;
begin
 RegisterComponents("Samples", [TCustomEdit1]);
end;

end.

Использование в приложении
procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(CustomEdit11.Handle,MM_Beep,0,0);
end;

А ссылки у меня нет надо искать в литературе


 
NewDelpher ©   (2004-10-15 10:00) [9]


> R ©   (15.10.04 09:57) [8]
> Вот пример класса обрабатывающего собственное сообщение.
> unit CustomEdit1

и за это спасибо. Буду разбираться.


 
Леван   (2004-10-15 10:10) [10]

V CIKLE
SENDMESSAGE(TYOUROBJECT(TSTRINGLIST1.OBJECTS[I]).HANDLE, SOBSTVENNO SOOBSHENIE,PARAMETRI)


 
KSergey ©   (2004-10-15 10:12) [11]

> [8] R ©   (15.10.04 09:57)

перечитайте вопрос внимательно
Его интересует как послать, а не обработать.


 
KSergey ©   (2004-10-15 10:16) [12]

> [7] NewDelpher ©   (15.10.04 09:49)
> Надо, чтобы синхоронно всё было.

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

К стати, что такое "синхронность" по-вашему? Одновременно?

Вот вы человек здравомыслящий, верно? У вас на компьютере один процессор, правильно? Один процессор в каждый комкретный момент времени выполняет одну команду, верно?

ТАК О КАКОЙ НАФИГ СИНХРОННОСТИ (ОДНОВРЕМЕННОСТИ) ВЫ ВЕДЕТЕ РЕЧЬ??!!!


 
Erik1 ©   (2004-10-15 10:22) [13]

Да сообщения тут нужны, как рыбе зоник. Вот если бы все наоборот асинхроно должно было работать, то PostMessage в самый раз. Виртуальные методы однозначно.


 
©   (2004-10-15 10:24) [14]

>KSergey ©   (15.10.04 10:12) [11]
Да вопрос я понял. Просто привел пример варианта(и Ваш правилен)
именно как было в вопросе через сообщения. А одновременности не будет и в моем примере. На компе одновременно по моему вообще ничего не происходит и не выполняется.


 
©   (2004-10-15 10:29) [15]

В продолжение [14]
Например вот это- тот же цикл(одновременности нет)
procedure TForm1.Button1Click(Sender: TObject);
var
I:Byte;
begin
for I:=0 To Self.ComponentCount-1 Do
If Self.Components[I] is TCustomEdit1
Then SendMessage(TCustomEdit1(Self.Components[I]).Handle,MM_Beep,0,0);
end;


 
NewDelpher ©   (2004-10-15 10:29) [16]


> KSergey ©   (15.10.04 10:16) [12]
> > [7] NewDelpher ©   (15.10.04 09:49)
> > Надо, чтобы синхоронно всё было.
>
> Ну когда этот наивняк закончится, блин? Ну был же уже этот
> вопрос не так давно, точно такой же.
> Надеюсь, это не вы были??
>
> К стати, что такое "синхронность" по-вашему? Одновременно?
>
> Вот вы человек здравомыслящий, верно? У вас на компьютере
> один процессор, правильно? Один процессор в каждый комкретный
> момент времени выполняет одну команду, верно?
>
> ТАК О КАКОЙ НАФИГ СИНХРОННОСТИ (ОДНОВРЕМЕННОСТИ) ВЫ ВЕДЕТЕ
> РЕЧЬ??!!!


Это понятно, что один процессор. Получается при отсылке сообщения группе объектов происходит беганье по всему списку и присваивание? Но в ведь в этом случае действия в объектах будут выполнены последовательно? А мне надо, что бы первый объект ничего не делал, пока последний не получил сообщение.


 
NewDelpher ©   (2004-10-15 10:36) [17]

Ну оговорился, не синхронно, а псведосинхронно


 
ЮЮ ©   (2004-10-15 10:43) [18]

>А мне надо, что бы первый объект ничего не делал, пока последний не получил сообщение.

А смысл. Но после того, как последний получит сообщение, выплгяясь а одном потоке, свои действия они тоже смогут выполнять только последовательно. Тогда уж заводи по отдельному thread для действий каждого объекта - получишь такую псведосинхроннось, боже упаси :)


 
MegaVolt ©   (2004-10-15 10:46) [19]

Всё равно будет последовательно.
Какой разбег между N и N+1 объектом ты допускаешь?
Или между первым и последним?


 
NewDelpher ©   (2004-10-15 11:05) [20]


> Всё равно будет последовательно.

Последовательно будет, но... При пробеге в цикле первый объект изменил свое состояние и начал действовать (при этом он может анализировать состояние других объектов и в соответсвии с ним выполнять то или другое действие), тогда если последний находится в "старом" состоянии, то поведение первого объекта будет неверным.

> Тогда уж заводи по отдельному thread для действий каждого
> объекта

Завел бы, да нужно чтобы была общая для всех постоянная времени t. И процессы бы в каждом объекте выполнялись с задержкой t*n, где n - различна для каждого.


 
Erik1 ©   (2004-10-15 11:13) [21]

Так у тебя проблемы в алгоритме, а сообщения тут совершенно непричем. Вобшето можно  Dispatch(Message) использовать, но это просто для общего развития. А тебе надо серезно подумать над алгоритмом, возможно, что тебе объекты вобще ненужны. Приведи задачу полностью.


 
NewDelpher ©   (2004-10-15 11:33) [22]


> Так у тебя проблемы в алгоритме, а сообщения тут совершенно
> непричем. Вобшето можно  Dispatch(Message) использовать,
> но это просто для общего развития. А тебе надо серезно подумать
> над алгоритмом, возможно, что тебе объекты вобще ненужны.
> Приведи задачу полностью.

Dispatch(Message)? А можно пример?

Задача такая. Есть куча однотипных объектов с различными сценариями поведения. Надо смоделировать их действия в общей среде.


 
Zelius ©   (2004-10-15 11:41) [23]

Потоки + Event"ы, тогда можно говорить о какой-то синхронности.


 
NewDelpher ©   (2004-10-15 12:06) [24]


> Zelius ©   (15.10.04 11:41) [23]
> Потоки + Event"ы, тогда можно говорить о какой-то синхронности.


Сделаю я TNotifyEvent в объектах. Но ведь, чтобы событие генерить, надо все равно конкретный объект указывать? Или я не прав?


 
Erik1 ©   (2004-10-15 12:14) [25]

Можно использовать WaitForMultiObject а event устанавливать один на всех. Зачем тебе Dispatch все равно сообщения тебе ненужны. Тебе надо создать один Thtead где в цикле обработать один шаг у все твоих объектов, после опять цикл по всем объектам и второй шаг расчетов. И так до конца самого длиного цикла.


 
Zelius ©   (2004-10-15 12:26) [26]

НА каждый объект по потоку, в каждом потоке ждать по WaitForSingleObject WaitForMultipleObject этот евент с ручным сбросом, а потом в главном потоке установить этот евент и тогда все потоки начнут дружно синхронно работать.


 
Sandman25 ©   (2004-10-15 12:34) [27]

Как я понял, есть 20 переменных a1, a2, a3, a4..., a20.
Нужно посчитать новые значение переменных по формулам:
a1=f1(a1, a2, ...)
a2=f2(a1, a2, ...)
...
Так вот, без сохранения старых значений переменных это невозможно.


 
NewDelpher ©   (2004-10-15 12:35) [28]


> Можно использовать WaitForMultiObject

А в D5 это есть? Что-то не нашел.


 
NewDelpher ©   (2004-10-15 12:43) [29]

А если использовать TClientSocket и TServerSocket, это не будет выглядеть глупо?


 
KSergey ©   (2004-10-15 15:20) [30]

> NewDelpher

Сам не знаешь что хочешь...
Возьми три объекта и помоделируй на пальцах все что тут понаписал. И пр "синхронность" и про "старое состояние" и т.п.
Вот тут и наступит понимание, что такого просто не бывает чего хочется.
А хочется бреда: вроде понимание пришло, что только последовательно (да, только последовательно!), но "сосяние второго зависит от сосяния первого". А состояние первого, надо думать, зависит от сосяния второго... И оба должны быть либо в сосянии А, либо в сосянии Б. Теперь вспоминаем, что работают принципиально последовательно (даже потоки!) - и как ты себе это представляешь?
Максимум что можно придумать - до полной смены состония выдавать наружу старые, непротиворечивые данне. Как поменялось - новые, опять же непротиворечивые...

Короче, надоело писать.
Начни с 3-х на пальца - дальше сам поймешь, думаю.



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

Форум: "Основная";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.032 c
4-1096180093
___^}{@eRo^___
2004-09-26 10:28
2004.10.31
Создание Рабочего стола


3-1096970244
funtik123
2004-10-05 13:57
2004.10.31
Количсетво записей


3-1096459367
Bless
2004-09-29 16:02
2004.10.31
Почему парсер в queryAnalizer-е выдает ошибку


1-1098261593
Zhekson
2004-10-20 12:39
2004.10.31
Отсчёт времени(Timer) в отдельном потоке


14-1096854563
Думкин
2004-10-04 05:49
2004.10.31
С днем рождения! 4 октября





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