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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.023 c
14-1097631755
Думкин
2004-10-13 05:42
2004.10.31
С днем рождения! 13 октября


6-1093346198
RaPtoR_1
2004-08-24 15:16
2004.10.31
ftp сервер


6-1093085403
fax
2004-08-21 14:50
2004.10.31
Подключение к сайту и ввод нужных данных....


3-1096542714
UnDISCOvery
2004-09-30 15:11
2004.10.31
БД Access - "Обновление невозможно; установлена блокировка"


14-1097489837
ValeX
2004-10-11 14:17
2004.10.31
Есть экзешник на делфи, Исходник нет. Как перевести текст кнопок?