PDA

Просмотр полной версии : Запрет на запуск нескольких экземпляров клипа.


Domovoy
27.07.2007, 03:30
Как можно запретить многократный запуск одной и той же флешки? Пытался сделать через локал коннекшн, но не смог обойти получение данных самим клипом отправителем. Т.е. он сам себя вырубает.

DarkLight
27.07.2007, 03:55
SharedObject с прописанным localPath при создании. Запущенная флешка проверяет, если нет объекта - создает. если есть - читает счетчик. Перед выходом из последней флешки счетчик обнуляется

Domovoy
27.07.2007, 10:06
Так, как раз вчера заснул когда реализацию через шаредобжект начал обдумывать. НО! Если выход через созданную кнопку, то понятно как реализовать. А если плеер закрывается как виндоус приложение? Как отследить закрытие флешки?
Просто может видимо возникнуть ситуация, когда сохранится ненулевой счетчик. Тогда вообще запускаться перестанет.

etc
27.07.2007, 10:10
DarkLight, тебе MyXus расскажет, как работает SO, пока не закрыта первая флешка. А работает он так, что пока открыта эта флешка, в SO продолжают находиться старые данные, даже если делать flush.

Я бы сделал просто connect у LocalConnection, проверяя onStatus. Если connect не удался, то закрывать нафиг.

CorC
27.07.2007, 10:11
Используйте какие-нибудь оболочки, для отлова закрытия.
Можно так же таймаут на шаредобжект, типа, если прошло 5 мин, то можно дубликат открывать.

iNils
27.07.2007, 13:13
DarkLight, тебе MyXus расскажет, как работает SO, пока не закрыта первая флешка. А работает он так, что пока открыта эта флешка, в SO продолжают находиться старые данные, даже если делать flush.????
http://www.inils.ru/test/a.html
И код
var txt:TextField = this.createTextField("txt", 0, 10, 10, 200, 20);
var so:SharedObject = SharedObject.getLocal ("n", "/");
setInterval(this, "e", 100);
if (so.data.c) {
cx = so.data.c;
} else {
cx = 0;
}
function e () {
cx++;
txt.text = so.data.c;
so.data.c = cx;
}
Или я то то не так понял?

etc
27.07.2007, 13:17
Ну, результат налицо же, каждая новая флешка начинает свой «путь» с нуля. Либо с того числа, которое сохранила последняя закрытая флешка. И flush тут тоже не сработает, он куда-то в temp сохраняет файл, несмотря ни на что.

iNils
27.07.2007, 13:21
А понял, я подумал, что внутри одного swf данные не меняются.

DarkLight
27.07.2007, 16:52
var txt:TextField = this.createTextField("txt", 0, 10, 10, 200, 20);
var so:SharedObject = SharedObject.getLocal("n33", "/");
if (so.data.c) {
cx = so.data.c;
} else {
cx = 0;
}
e();
function e() {
cx++;
so.data.c = cx;
txt.text = so.data.c;
delete so;//и все сохраняется, без этого нет

}
function e0() {
var so:SharedObject = SharedObject.getLocal("n33", "/");
txt.text += " "+so.data.c;
delete so;
}
setTimeout(e0,8000);

iNils
27.07.2007, 17:05
DarkLight, речь не об этом шла.
первый swf
var txt:TextField = this.createTextField ("txt", 0, 10, 10, 200, 20);
setInterval(this, "e", 100);
function e () {
var so:SharedObject = SharedObject.getLocal ("n", "/");
if (!so.data.cx) {
so.data.cx = 0;
}
so.data.cx++;
txt.text = so.data.cx;
so.flush()
delete so;
}
второй swf
var txt:TextField = this.createTextField ("txt", 0, 10, 10, 200, 20);
setInterval(this, "e", 100);
function e () {
var so:SharedObject = SharedObject.getLocal ("n", "/");
if (!so.data.cx) {
so.data.cx = 0;
}
so.data.cx+=1000;
txt.text = so.data.cx;
so.flush()
delete so;
}
а теперь запусти их одновременно, один будет только 1000 прибавлять, а другой 1.

DarkLight
27.07.2007, 17:13
http://dl1t.com/112.jpg

А если вынести из цикла создание объекта и убрать delete, то действительно каждый отдельно(http://dl1t.com/32.jpg).

iNils
27.07.2007, 17:18
Так я не убираю delete. Но заметил особенность. Если запустить один и он добежит пусть то 8, то запустив второй в этот момент, он сразу выдаст 1008.

etc
27.07.2007, 17:24
В общем и целом, работа с SO довольно странная.

DarkLight
27.07.2007, 17:25
У меня на 1ом скриншоте оба свф синхронно прибавляют 1001. Только секунд через 10 начинается асинхронность и сбрасывание до 0. При интервале между записями в секунду уже этого не происходит.
http://dl1t.com/Untitled-2.swf
http://dl1t.com/Untitled-3.swf

Насколько я понял, освобождение SO происходит не сразу после удаления экземпляра в AS

Domovoy
27.07.2007, 21:22
Я бы сделал просто connect у LocalConnection, проверяя onStatus. Если connect не удался, то закрывать нафиг.
Но ведь всё равно, даже первый экземпляр будет слушать канал. И он ответит сам себе на запрос. Соответственно onStatus покажет, что кто-то (сама флешка) слушает канал. И закроется сам собой.
Хотя в принципе код на включение прослушки канала можно отстрочить таймером... Как бы только время подобрать?
Чтобы и запрос успел пройти, и пользователь четверной клик на эекзешнике не успел сделать.

etc
27.07.2007, 22:51
Нееет, насколько я помню, connect не сработает второй раз на то же имя.
Если работает, то можно проверить тогда send. Если send удался, то значит коннект уже кем-то открыт (т.е. со статусом все в порядке) и нам надо закрываться.

Domovoy
28.07.2007, 00:14
Ну вот в том то и дело, что коннект надо и в самой первой флешке открывать. И её же сенд, она сама и получит.

Kikasso
28.07.2007, 02:28
Ну вот в том то и дело, что коннект надо и в самой первой флешке открывать. И её же сенд, она сама и получит.
Ну это как раз не проблема. Если флешка получает на этой волне, она и есть единственная.
connect держать может только одна.

etc
28.07.2007, 11:27
А что мешает сначала сделать send? Если не удался, значит коннекта нет и делаем коннект. Если удался, значит коннект уже открыт кем-то и мы должны закрываться.

Domovoy
28.07.2007, 12:08
Оказывается connect сам возвращает результат. Ну вообщем понятно, что true если соединение с каналом установлено и false, если нет. Таким образом написал код:

lc_in= new LocalConnection();
if(!lc_in.connect("can")) {fscommand("quit");}


Всем спасибо.