Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Запрет на запуск нескольких экземпляров клипа. (http://www.flasher.ru/forum/showthread.php?t=99057)

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

Цитата:

Сообщение от __etc
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

Цитата:

Сообщение от __etc
Я бы сделал просто 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

Цитата:

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

Ну это как раз не проблема. Если флешка получает на этой волне, она и есть единственная.
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");}


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


Часовой пояс GMT +4, время: 15:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.