Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Problema con file lock

  1. #1

    Problema con file lock

    ciao!
    vorrei impostare un blocco su file in modo da non poter lanciare due volte lo stesso programma contemporaneamente.
    ho fatto una cosa così:
    codice:
    public class Locker {
    
        private static final File file = new File("lock.clk");
        private static FileChannel channel = null;
        private static FileLock fileLock = null;
        private static boolean isLocked = false;
    
        public static boolean lock() throws FileNotFoundException, IOException {
            if (!file.exists()) {
                file.createNewFile();
                channel = new RandomAccessFile(file, "rw").getChannel();
                fileLock = channel.tryLock();
                if (fileLock == null) {
                    isLocked = true;
                }
            }
            return isLocked;
        }
    
        public static void unlock() throws IOException {
            fileLock.release();
            channel.close();
            file.delete();
            isLocked = false;
        }
    
        public static boolean isLocked() {
            return isLocked;
        }
    }
    il file lock.clk viene creato e cancellato correttamente.
    solo che posso cmq lanciare più volte lo stesso programma, come se il lock non venisse fatto.
    lo richiamo così nel jframe:
    codice:
        public static void main(String args[]) throws FileNotFoundException, IOException {
            if (!Locker.isLocked()) {
                java.awt.EventQueue.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        new Main().setVisible(true);
                    }
                });
                Locker.lock();
            } else {
                JOptionPane.showMessageDialog(null, "Il file è bloccato da un altro processo");
            }
        }
    dove sto sbagliando secondo voi??

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Nella logica.
    Tu per prima cosa verifichi il metodo isLocked() che, sempre e comunque, ritornerà false la prima volta che la tua istanza viene eseguita.

    La variabile, infatti, viene valorizzata a true solo nel metodo lock() e solo se il lock è già stato acquisito da qualcun altro... ma all'inizio tu tale metodo non lo invochi... lo invochi solo dopo che l'applicazione l'hai già avviata...

    codice:
    if (!Locker.isLocked()) {
    il metodo "isLocked", eseguito come prima istruzione, ritornerà sempre e solo false.

    Non è così che devi procedere: per prima cosa devi provare ad acquisire il lock. Se ci riesci, procedi, altrimenti non devi fare nulla.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    intanto grazie per la risposta.

    da quanto ho capito devo prima richiamare il metodo lock, e poi testare il metodo isLocked giusto?
    codice:
        public static void main(String args[]) throws FileNotFoundException, IOException {
            Locker.lock();
            if (!Locker.isLocked()) {
                java.awt.EventQueue.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        new Main().setVisible(true);
                    }
                });
            } else {
                JOptionPane.showMessageDialog(null, "Il file è bloccato da un altro processo");
            }
        }
    ho provato così, ma non è cambiato nulla.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Questo un esempio banalissimo:

    codice:
    import java.io.*;
    import java.nio.*;
    import java.nio.channels.*;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    public class Locked extends JFrame {
    
       private static File fileLock = new File("mioFile.lck");
       private static RandomAccessFile raf = null;
       private static FileChannel fc = null;
       private static FileLock lock;
       
    
       public Locked() {
          setSize(800, 600);
          setTitle("Prima ed unica istanza");
          setDefaultCloseOperation( DO_NOTHING_ON_CLOSE );
          addWindowListener( new WindowAdapter() {
             @Override
             public void windowClosing(WindowEvent we) {
                chiudiApplicazione();
             }
          });
          setLocationRelativeTo( null );
          setVisible( true );
       }
    
       private void chiudiApplicazione() {
          // Rilascio il lock
          dispose();
          try {
             lock.release();
             fc.close();
             raf.close();
             fileLock.delete();
          } catch (Exception e) {
             e.printStackTrace();
          }
       }
    
       public static void main(String[] args) {
          if ( tryLock() ) {
             Locked l = new Locked();
          } else {
             JOptionPane.showMessageDialog(null, "Altra applicazione già avviata", "Errore", JOptionPane.ERROR_MESSAGE);
          }
       }
    
       private static boolean tryLock() {
          boolean ret = false;
    
          try {
             raf = new RandomAccessFile(fileLock, "rw");
             fc = raf.getChannel();
             lock = fc.tryLock();
             if (lock != null) {
                ret = true;
             }
          } catch (Exception e) {
             e.printStackTrace();
          }
    
          return ret;
       }
    
       private static void apriFinestra() {
          Locked l = new Locked();
       }
    }
    Se non c'è nessun lock (è la prima volta che si avvia l'applicazione), viene aperta la finestra, altrimenti viene visualizzato il messaggio d'errore.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    perfetto, adesso ho capito.
    grazie!!

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    altrimenti se non vuoi usare un file di lock, guarda questa vecchia discussione

    http://forum.html.it/forum/showthrea...readid=1092048
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.