Форум: "Основная";
Текущий архив: 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)
> нет, такой вариант не годится.
Отчего же??
← →
R © (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)
> > нет, такой вариант не годится.
>
> Отчего же??
Надо, чтобы синхоронно всё было.
← →
R © (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 в самый раз. Виртуальные методы однозначно.
← →
R © (2004-10-15 10:24) [14]>KSergey © (15.10.04 10:12) [11]
Да вопрос я понял. Просто привел пример варианта(и Ваш правилен)
именно как было в вопросе через сообщения. А одновременности не будет и в моем примере. На компе одновременно по моему вообще ничего не происходит и не выполняется.
← →
R © (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.052 c