Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизИдея нужна. Синхронизация действий. Найти похожие ветки
← →
AV © (2012-08-17 14:25) [0]Есть исполнитель(ИИ), он один
и есть командующие(КК). КК может быть много, от 0 до , ну, пусть, 50.
ИИ выполняет одну команду долго, скажем, минуту.
КК могут командовать со скоростью, от 0 до 100 команд в минуту.
КК подают команды, не зная друг о друге. Команды могут быть противоречивые.
момент времени ВВ:
КК1 сказал, что надо выключить лампочку ЛЛ1 и включить ЛЛ2.
Исполнитель начал выполнять.
момент времени ВВ + 1 сек:
КК2 сказал, что надо включить лампочку ЛЛ1 и выключить ЛЛ2.
момент времени ВВ + 60 сек:
Исполнитель выключил лампочку ЛЛ1. Теперь ему не надо уже доделывать команду КК1, а именно, включить ЛЛ2. Потому что КК2 уже дал команду по этой лампочке, что ее надо выключить. Она уже выключена. Но он же (КК2) и сказал, что лампочка ЛЛ1 должна быть включена. А она тока что выключена была. Значит, ИИ должен ее включить.
Вот.
И таких команд сыпаться может много. А может и мало. А ИИ только один и работает долго.
Что посоветуете?
← →
Sha © (2012-08-17 14:33) [1]ИИ не дожен выполнять команды.
Он должен ликвидироветь разницу между текущим состоянием
и будущим состоянием после выполнения всех поступивших команд.
← →
Игорь Шевченко © (2012-08-17 14:33) [2]Одна очередь для команд. При добавлении очередной команды проверять существующие в очереди на противоречия.
Но мне так кажется, не лампочки у тебя зажигаются, а какие-то другие действия. Возможно, для других действий будут другие решения.
← →
AV © (2012-08-17 14:33) [3]Лампочек около 50 000,
Состояний каждой - 3
← →
Игорь Шевченко © (2012-08-17 14:36) [4]
> Состояний каждой - 3
а какое третье состояние у лампочки и почему ее так долго надо зажигать ?
← →
Германн © (2012-08-17 14:44) [5]
> AV © (17.08.12 14:33) [3]
>
> Лампочек около 50 000,
> Состояний каждой - 3
>
Поменьше фантазий, Влад. И побольше реалий!
← →
Anatoly Podgoretsky © (2012-08-17 14:44) [6]> Игорь Шевченко (17.08.2012 14:36:04) [4]
Горит, не горит, кажется уже сгорела
← →
Давайте будем жрать! (2012-08-17 14:46) [7]Если допустить, что 1) лампочки независимы и "КК1 сказал, что надо выключить лампочку ЛЛ1 и включить ЛЛ2." = "КК1 сказал, что надо выключить лампочку ЛЛ1." + "КК1 сказал, что надо включить ЛЛ2."; 2) волнует только конечное состояние лампочки, а не факт её переключения между состояниями, то просматриваем очередь команд с конца, найдя энную лампочку, переключаем её в соответствующее состояния и удаляем все команды, касающиеся данной лампочки.
Но "ИИ только один и работает долго" наводит на мысль, что допущения неверны.
← →
Sha © (2012-08-17 14:46) [8]Светофор?
← →
Давайте будем жрать! (2012-08-17 14:49) [9]
> Светофор?
> Лампочек около 50 000, Состояний каждой - 3
Спаси Аллах от такого светофора %-)
← →
AV © (2012-08-17 14:51) [10]Да, это не лампочки :)
Это передатчики сигнала. Передает, принимает, ничего не делает.
Важно, как можно быстрее, привести к конечному состоянию.
Команды обычно идут шквалом, потом затишье на несколько дней.
Итого, как понял:
завести список/таблицу
Прибор("лампочка") - состояние
Первая таблица - будущее состояние
И еще одна таблица - текущее состояние
отдельный поток
При приеме команды - обновляет таблицу будущие_состояния, гарантируя уникальность лампочка-состояние
второй поток
:strat
соединяем таблицы по прибору, где состояния разные.
первую строку приводим в соответствие. Изменяем ее в таблице с текущим состоянием.
goto strat;
← →
AV © (2012-08-17 14:58) [11]а почему долго - не знаю. Правда, насчет минуты я тоже загнул, секунд 20, на самом деле.
Но командовать могут именно так, до 100 в минуту от каждого из 50 на один прибор. Там своя логика, в зависимости от того что работает, а что нет, что-то другое должно наоборот. Потом устаканивается, до следующего всплеска.
← →
AV © (2012-08-17 14:58) [12]Собственно, процесс "устаканивания" и надо сократить.
← →
Сергей М. © (2012-08-17 15:00) [13]
> исполнитель..один.. командующие..может быть много
Стой там, иди сюда)
← →
Anatoly Podgoretsky © (2012-08-17 15:08) [14]> AV (17.08.2012 14:58:11) [11]
Похоже на спам
← →
AV © (2012-08-17 15:58) [15]Удалено модератором
Примечание: А это спам
← →
Игорь Шевченко © (2012-08-17 15:58) [16]
> Но командовать могут именно так, до 100 в минуту от каждого
> из 50 на один прибор. Там своя логика, в зависимости от
> того что работает, а что нет, что-то другое должно наоборот.
> Потом устаканивается, до следующего всплеска.
Сдается мне, что надо идти от "своей логики", а не обобщать задачу.
← →
Андреевич (2012-08-17 15:58) [17]
> а какое третье состояние у лампочки и почему ее так долго
> надо зажигать ?
в принципе, это может быть светодиод: не горит, горит зеленым, горит красным. Точнее раньше встречал красно-желтые и оранжево-зеленые.
← →
AV © (2012-08-17 16:01) [18]
> надо идти от "своей логики"
возможно. Надо подумать.
← →
картман © (2012-08-17 16:20) [19]
>
> возможно. Надо подумать.
я б дождался окончания "всплеска" команд:)
← →
Давайте будем жрать! (2012-08-17 16:53) [20]Удалено модератором
Примечание: Offtopic
← →
AV © (2012-08-17 16:55) [21]да нет же, это старые, слабо мощные некие передатчики.
Он передает одно и тоже, пока ему не скажешь, что все приняли, хватит передавать, теперь слушай. Он слушает, пока не услышит, что пора передавать.
Но может не услышать, потому что, говорю же, слабые они. Поэтому ему команда передается до тех пор, пока не будет понятно, что он подчинился. Отсюда все так долго, точнее, непредсказуемо, а в среднем - 20 секунд на один уходит.
Управляет ими всеми один, более мощный передатчик, который и управляется "моей" программой, на основе данных из БД, которые могут менять те самые ~50 юзеров. А понять их логику трудно. Да они могут и просто ошибиться. Думаю, что лучше просто повторить их команды. Пусть они сами разбираются, кто прав-виноват и как должно быть.
На самом деле все это уже пытался сделать, потому что спрашивал уже с год назад. Но тогда я неправильно сделал, лажает немного. Некоторые команды остаются долго не выполнены, а некоторые повторяются, тратится время. А все потому, что дописывал, а не сам все сделал. Что-то оставил из старого, потому что не понял до конца..
Теперь думаю, пока в отпуске, разбить на логически-маленькие задачки, и делать в два потока. Ну, как написал выше. И, главное, с чистого листа и когда никто не отвлекает на текучку.
← →
Давайте будем жрать! (2012-08-17 16:56) [22]
> AV © (17.08.12 16:55) [21]
Оу... Ну прям перечитанный на днях "Непобедимый" %-)
← →
AV © (2012-08-17 16:59) [23]блин, то ли я тупею, но правда, не понимаю .. (наверное, надо меньше развлекалки читать/смотреть)
> Давайте будем жрать! (17.08.12 16:56) [22]
это к чему? (на пальцах желательно)
← →
Давайте будем жрать! (2012-08-17 17:01) [24]
> это к чему? (на пальцах желательно)
Это в шутку. "Непобедимый" — роман Лема. Про то, как микроскопические примитивные "роящиеся" роботы "нагибают" макророботов. %-)
← →
Sha © (2012-08-17 17:02) [25]
unit LampsF;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
ListBox2: TListBox;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure ListBox1Data(Control: TWinControl; Index: Integer; var Data: String);
procedure ListBox2Data(Control: TWinControl; Index: Integer; var Data: String);
procedure Timer1Timer(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TState= record
Next, Prev, Value, NewValue: integer;
end;
var
States: array of TState;
Tick: integer= 0;
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin;
//ãîëîâà + 9 ëàìïî÷åê
SetLength(States,10);
for i:=0 to Length(States)-1 do begin;
States[i].Next:=i;
States[i].Prev:=i;
States[i].Value:=0;
States[i].NewValue:=0;
end;
ListBox1.Style:=lbVirtual;
ListBox1.Count:=Length(States)-1;
ListBox2.Style:=lbVirtual;
ListBox2.Count:=Length(States)-1;
end;
procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer; var Data: String);
begin;
Data:=IntToStr(States[1+Index].NewValue);
end;
procedure TForm1.ListBox2Data(Control: TWinControl; Index: Integer; var Data: String);
begin;
Data:=IntToStr(States[1+Index].Value);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i, n, p: integer;
begin;
i:=Random(Length(States));
//åñëè êîìàíäà
if (0<i) and (i<Length(States)) then begin;
States[i].NewValue:=Random(3);
n:=States[i].Next;
p:=States[i].Prev;
//èç î÷åðåäè
if n<>i then begin;
States[p].Next:=n;
States[n].Prev:=p;
States[i].Next:=i;
States[i].Prev:=i;
end;
//â î÷åðåäü
if States[i].NewValue<>States[i].Value then begin;
States[i].Prev:=States[0].Prev;
States[States[0].Prev].Next:=i;
States[0].Prev:=i;
States[i].Next:=0;
end;
ListBox1.Invalidate;
end;
//âûïîëíÿåì íàêîïëåííîå
i:=States[0].Next;
if (Tick and 1=0) and (i<>0) then begin;
States[0].Next:=States[i].Next;
States[States[i].Next].Prev:=0;
States[i].Next:=i;
States[i].Prev:=i;
States[i].Value:=States[i].NewValue;
ListBox2.Invalidate;
end;
inc(Tick);
end;
end.
← →
Sha © (2012-08-17 17:06) [26]Выше код эмуляции поведения 9 лампочек, комментарии там такие:
//голова + 9 лампочек
//если команда
//из очереди
//в очередь
//выполняем накопленное
← →
TUser © (2012-08-20 12:16) [27]Бедный исполнитель, до чего же его довела бюрократия ))
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.072 c