Просмотр полной версии : Запрет на запуск нескольких экземпляров клипа.
Как можно запретить многократный запуск одной и той же флешки? Пытался сделать через локал коннекшн, но не смог обойти получение данных самим клипом отправителем. Т.е. он сам себя вырубает.
DarkLight
27.07.2007, 03:55
SharedObject с прописанным localPath при создании. Запущенная флешка проверяет, если нет объекта - создает. если есть - читает счетчик. Перед выходом из последней флешки счетчик обнуляется
Так, как раз вчера заснул когда реализацию через шаредобжект начал обдумывать. НО! Если выход через созданную кнопку, то понятно как реализовать. А если плеер закрывается как виндоус приложение? Как отследить закрытие флешки?
Просто может видимо возникнуть ситуация, когда сохранится ненулевой счетчик. Тогда вообще запускаться перестанет.
DarkLight, тебе MyXus расскажет, как работает SO, пока не закрыта первая флешка. А работает он так, что пока открыта эта флешка, в SO продолжают находиться старые данные, даже если делать flush.
Я бы сделал просто connect у LocalConnection, проверяя onStatus. Если connect не удался, то закрывать нафиг.
Используйте какие-нибудь оболочки, для отлова закрытия.
Можно так же таймаут на шаредобжект, типа, если прошло 5 мин, то можно дубликат открывать.
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;
}
Или я то то не так понял?
Ну, результат налицо же, каждая новая флешка начинает свой «путь» с нуля. Либо с того числа, которое сохранила последняя закрытая флешка. И flush тут тоже не сработает, он куда-то в temp сохраняет файл, несмотря ни на что.
А понял, я подумал, что внутри одного 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);
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).
Так я не убираю delete. Но заметил особенность. Если запустить один и он добежит пусть то 8, то запустив второй в этот момент, он сразу выдаст 1008.
В общем и целом, работа с 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
Я бы сделал просто connect у LocalConnection, проверяя onStatus. Если connect не удался, то закрывать нафиг.
Но ведь всё равно, даже первый экземпляр будет слушать канал. И он ответит сам себе на запрос. Соответственно onStatus покажет, что кто-то (сама флешка) слушает канал. И закроется сам собой.
Хотя в принципе код на включение прослушки канала можно отстрочить таймером... Как бы только время подобрать?
Чтобы и запрос успел пройти, и пользователь четверной клик на эекзешнике не успел сделать.
Нееет, насколько я помню, connect не сработает второй раз на то же имя.
Если работает, то можно проверить тогда send. Если send удался, то значит коннект уже кем-то открыт (т.е. со статусом все в порядке) и нам надо закрываться.
Ну вот в том то и дело, что коннект надо и в самой первой флешке открывать. И её же сенд, она сама и получит.
Ну вот в том то и дело, что коннект надо и в самой первой флешке открывать. И её же сенд, она сама и получит.
Ну это как раз не проблема. Если флешка получает на этой волне, она и есть единственная.
connect держать может только одна.
А что мешает сначала сделать send? Если не удался, значит коннекта нет и делаем коннект. Если удался, значит коннект уже открыт кем-то и мы должны закрываться.
Оказывается connect сам возвращает результат. Ну вообщем понятно, что true если соединение с каналом установлено и false, если нет. Таким образом написал код:
lc_in= new LocalConnection();
if(!lc_in.connect("can")) {fscommand("quit");}
Всем спасибо.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.