![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сообщения. Не знаю как подступиться. [D5, Win95/98]
NewDelpher © (2004-10-15 09:17:00)Есть приложение в котором штук 50 объектов, наследованных от одного класса. Есть объект, который должен через определенные промежутки времени послылать всем этим объектам сообщение. А они, получив его, производят какие-нибудь действия.
Вот я и не знаю с чего начать? И как организовать такой обмен? Какие есть в Delphi инструменты?
KSergey (2004-10-15 15:20:00) [1]> NewDelpher
Сам не знаешь что хочешь...
Возьми три объекта и помоделируй на пальцах все что тут понаписал. И пр "синхронность" и про "старое состояние" и т.п.
Вот тут и наступит понимание, что такого просто не бывает чего хочется.
А хочется бреда: вроде понимание пришло, что только последовательно (да, толькопоследовательно!), но "сосяние второго зависит от сосяния первого". А состояние первого, надо думать, зависит от сосяния второго... И оба должны быть либо в сосянии А, либо в сосянии Б. Теперь вспоминаем, что работают принципиально последовательно (даже потоки!) - и как ты себе это представляешь?
Максимум что можно придумать - до полнойсмены состония выдавать наружу старые, непротиворечивые данне. Как поменялось - новые, опять же непротиворечивые...
Короче, надоело писать.
Начни с 3-х на пальца - дальше сам поймешь, думаю.
NewDelpher (2004-10-15 12:43:00) [2]А если использовать TClientSocket и TServerSocket, это не будет выглядеть глупо?
NewDelpher (2004-10-15 12:35:00) [3]
> Можно использовать WaitForMultiObject
А в D5 это есть? Что-то не нашел.
Sandman25 (2004-10-15 12:34:00) [4]Как я понял, есть 20 переменных a1, a2, a3, a4..., a20.
Нужно посчитать новые значение переменных по формулам:
a1=f1(a1, a2, ...)
a2=f2(a1, a2, ...)
...
Так вот, без сохранения старых значений переменных это невозможно.
Zelius (2004-10-15 12:26:00) [5]НА каждый объект по потоку, в каждом потоке ждать по WaitForSingleObject WaitForMultipleObject этот евент с ручным сбросом, а потом в главном потоке установить этот евент и тогда все потоки начнут дружно синхронно работать.
Erik1 (2004-10-15 12:14:00) [6]Можно использовать WaitForMultiObject а event устанавливать один на всех. Зачем тебе Dispatch все равно сообщения тебе ненужны. Тебе надо создать один Thtead где в цикле обработать один шаг у все твоих объектов, после опять цикл по всем объектам и второй шаг расчетов. И так до конца самого длиного цикла.
NewDelpher (2004-10-15 12:06:00) [7]
> Zelius © (15.10.04 11:41) [23]
> Потоки + Event'ы, тогда можно говорить о какой-то синхронности.
Сделаю я TNotifyEvent в объектах. Но ведь, чтобы событие генерить, надо все равно конкретный объект указывать? Или я не прав?
Zelius (2004-10-15 11:41:00) [8]Потоки + Event'ы, тогда можно говорить о какой-то синхронности.
NewDelpher (2004-10-15 11:33:00) [9]
> Так у тебя проблемы в алгоритме, а сообщения тут совершенно
> непричем. Вобшето можно Dispatch(Message) использовать,
> но это просто для общего развития. А тебе надо серезно подумать
> над алгоритмом, возможно, что тебе объекты вобще ненужны.
> Приведи задачу полностью.
Dispatch(Message)? А можно пример?
Задача такая. Есть куча однотипных объектов с различными сценариями поведения. Надо смоделировать их действия в общей среде.
Erik1 (2004-10-15 11:13:00) [10]Так у тебя проблемы в алгоритме, а сообщения тут совершенно непричем. Вобшето можно Dispatch(Message) использовать, но это просто для общего развития. А тебе надо серезно подумать над алгоритмом, возможно, что тебе объекты вобще ненужны. Приведи задачу полностью.
NewDelpher (2004-10-15 11:05:00) [11]
> Всё равно будет последовательно.
Последовательно будет, но... При пробеге в цикле первый объект изменил свое состояние и начал действовать (при этом он может анализировать состояние других объектов и в соответсвии с ним выполнять то или другое действие), тогда если последний находится в "старом" состоянии, то поведение первого объекта будет неверным.
> Тогда уж заводи по отдельному thread для действий каждого
> объекта
Завел бы, да нужно чтобы была общая для всех постоянная времени t. И процессы бы в каждом объекте выполнялись с задержкой t*n, где n - различна для каждого.
MegaVolt (2004-10-15 10:46:00) [12]Всё равно будет последовательно.
Какой разбег между N и N+1 объектом ты допускаешь?
Или между первым и последним?
ЮЮ (2004-10-15 10:43:00) [13]>А мне надо, что бы первый объект ничего не делал, пока последний не получил сообщение.
А смысл. Но после того, как последний получит сообщение, выплгяясь а одном потоке, свои действия они тоже смогут выполнять только последовательно. Тогда уж заводи по отдельному thread для действий каждого объекта - получишь такую псведосинхроннось, боже упаси :)
NewDelpher (2004-10-15 10:36:00) [14]Ну оговорился, не синхронно, а псведосинхронно
NewDelpher (2004-10-15 10:29:00) [15]
> KSergey © (15.10.04 10:16) [12]
> > [7] NewDelpher © (15.10.04 09:49)
> > Надо, чтобы синхоронно всё было.
>
> Ну когда этот наивняк закончится, блин? Ну был же уже этот
> вопрос не так давно, точно такой же.
> Надеюсь, это не вы были??
>
> К стати, что такое "синхронность" по-вашему? Одновременно?
>
> Вот вы человек здравомыслящий, верно? У вас на компьютере
> один процессор, правильно? Один процессор в каждый комкретный
> момент времени выполняет одну команду, верно?
>
> ТАК О КАКОЙ НАФИГ СИНХРОННОСТИ (ОДНОВРЕМЕННОСТИ) ВЫ ВЕДЕТЕ
> РЕЧЬ??!!!
Это понятно, что один процессор. Получается при отсылке сообщения группе объектов происходит беганье по всему списку и присваивание? Но в ведь в этом случае действия в объектах будут выполнены последовательно? А мне надо, что бы первый объект ничего не делал, пока последний не получил сообщение.
R (2004-10-15 10:29:00) [16]В продолжение [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;
R (2004-10-15 10:24:00) [17]>KSergey © (15.10.04 10:12) [11]
Да вопрос я понял. Просто привел пример варианта(и Ваш правилен)
именно как было в вопросе через сообщения. А одновременности не будет и в моем примере. На компе одновременно по моему вообще ничего не происходит и не выполняется.
Erik1 (2004-10-15 10:22:00) [18]Да сообщения тут нужны, как рыбе зоник. Вот если бы все наоборот асинхроно должно было работать, то PostMessage в самый раз. Виртуальные методы однозначно.
KSergey (2004-10-15 10:16:00) [19]> [7] NewDelpher © (15.10.04 09:49)
> Надо, чтобы синхоронно всё было.
Ну когда этот наивняк закончится, блин? Ну был же уже этот вопрос не так давно, точно такой же.
Надеюсь, это не вы были??
К стати, что такое "синхронность" по-вашему? Одновременно?
Вот вы человек здравомыслящий, верно? У вас на компьютере один процессор, правильно? Один процессор в каждый комкретный момент времени выполняет одну команду, верно?
ТАК О КАКОЙ НАФИГ СИНХРОННОСТИ(ОДНОВРЕМЕННОСТИ) ВЫ ВЕДЕТЕ РЕЧЬ??!!!
KSergey (2004-10-15 10:12:00) [20]> [8] R © (15.10.04 09:57)
перечитайте вопрос внимательно
Его интересует как послать, а не обработать.