Avatar billede thums Praktikant
29. september 2003 - 16:46 Der er 23 kommentarer og
1 løsning

Daemon lukker min tråd??

Jeg sætter en tråd til at kører i Daemon-mode for at forhindre folk i at stoppe programmet. Men det lader til at når den så begynder at flytte filer på harddisken så stopper den. Den når kun og opfatte at der er en fil -> skaber en fil der fylder 0kb og så når den skal fylde i stopper den med at gå videre. er i tvivl om den stadigvæk kører eller bare lukker ned når den skal overfører indholdet.
Nogen der ved noget om det? poster gerne koden hvis dette er nødvendigt.. :)
Avatar billede _carsten Nybegynder
29. september 2003 - 16:54 #1
Og du har husket at kalde close(), så objectet som skriver filen lukkes
Avatar billede dsj Nybegynder
29. september 2003 - 16:55 #2
Deamon-mode gør kun, at hvis ikke der er normale tråde tilbage i din applikation, stoppes deamon-trådene og applikationen lukker.
Avatar billede arne_v Ekspert
29. september 2003 - 16:55 #3
Er der nogen exceptions ?

(men lidt kode ville nok være en god ting)
Avatar billede dsj Nybegynder
29. september 2003 - 16:58 #4
Altså venter applikationen ikke på at tråde der køre i deamon-mode kører færdig, før der lukkes.
Avatar billede thums Praktikant
29. september 2003 - 20:53 #5
Der kommer lidt kode om 5 minutter.... Og nej... får ingen exceptiones da programmet smutter ud af min jde når den går i daemon mode
Avatar billede arne_v Ekspert
29. september 2003 - 21:00 #6
At sætte tråden til daemon forhindrer ikke folk i at stoppe programmet.

Der ville jeg snarere vælge at lave det uden GUI og starte det med javaw.

For mig lyder det iøvrigt som om du burde joine den startede tråd inden du
afslutter maib thread,
Avatar billede thums Praktikant
29. september 2003 - 21:09 #7
Hø hø Arne.... glæder mig til at hører mere om det ... ligenu begynder jeg at føle mig som en n00b :)
Avatar billede thums Praktikant
29. september 2003 - 21:14 #8
Main klassen
------------
class Main
{
    public static void main(String [] args)
    {
        Counter tråd=new Counter();
//        tråd.setDaemon(true);
        tråd.start();
    }
}
---------------
counter klassen(den centrale del)
--------------------------------
import java.io.File;
import java.io.BufferedOutputStream;
import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

class Counter extends Thread implements DbInterface
{
    String date;
    String timestamp;
    int weeknumber;
   
    String fraFolder="c://Java//Projekter//Counter/fra";
    String tilFolder="c://Java//Projekter//Counter/til";
   
    File folder;
   
    public Counter()
    {
        folder=new File(fraFolder);
    }
   
    public void run()
    {       
        while (true)
        {
            File [] filer=folder.listFiles();
            for (int i=0; i<filer.length; i++)
            {
                System.out.println(getDato(filer[i]));
//                copyFile(filer[i].getPath());
//                gemIDB(getFileName(filer[i]), timestamp, sidstændret, getFileSize(filer[i]), ugenummer);
//                filer[i].delete();
            }
           
            try
            {                   
                sleep(2000);
            } catch(InterruptedException e)
            {
                System.out.println(e);
            }
        }
    }
   
//Service-Metoder
    private void makeTimestamp()
    {
    }
       
//Færdige metoder
    private void gemIDB(String navn, String timestamp, String sidstændret, String size, int ugenummer)
    {
        DbAdgang db=new DbAdgang();
        int resultat = db.insert(navn, timestamp, sidstændret, size, ugenummer);
        System.out.println(resultat);
    }
   
    private void copyFile(String sourcePath)
    {
        try
        {
            File source=new File(sourcePath);
           
            System.out.println(sourcePath);
           
            BufferedInputStream in=new BufferedInputStream(new FileInputStream(source));
            BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream((new File(tilFolder)+"//"+source.getName())));
           
            int data;
           
            while((data=in.read())!=-1)
            {
                out.write(data);
            }
           
            in.close();
            out.close();
        }catch(FileNotFoundException e)
        {
            System.out.println(e);
        }catch(IOException e)
        {
            System.out.println(e);
        }
    }
   
    private String getFileSize(File file)
    {
        String resultat="";
        long size = file.length();
         
        if (size>=1024 && size<(1024*1024))
            resultat = (size/1024) + "." + (size%1024) + "Kb";
        else if (size>=(1024*1024) && size<(1024*1024*1024))
            resultat = (size/(1024*1024)) + "." + (size%(1024*1024));
        else if    (size>=(1024*1024*1024) && size<(1024*1024*1024*1024))
            resultat = (size/(1024*1024*1024)) + "." + (size%(1024*1024*1024));
       
        return resultat;
    }
       
    private String getFileName(File file)
    {
        return file.getName();
    }
   
    private long getDato(File file)
    {
        return file.lastModified();
    }
}
-----------------------------------
DB-klassen
----------------------------------
import java.net.URL;
import java.sql.*;
import java.util.*;

interface DbInterface{
  static final String  driver = "jdbc:mysql://localhost/";
  static final String  databasenavn = "file_super";
  static final String  brugernavn = "root";
  static final String password = "";
 
/*public void findAlle(AbstractList list);
  public Object findId(int id);
  public boolean exists(int id);
  public int insert(Object e);
  public int update(Object e);
  public int delete(Object e);*/
 

 
  //statisk inner class
  class DbAdgang{
    DatabaseMetaData dma;
    static Connection con;
    public DbAdgang(){
        this(driver, brugernavn, password);
    }
    public DbAdgang(String odbcdrv,String bruger, String passwd)
      {
         
      String url = odbcdrv + databasenavn;
       
        try{
            //load af driver
           
        // Class.forName("sun.jdbc.odbc.odbc");
            Class.forName("com.mysql.jdbc.Driver");
        //    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        }
        catch(Exception e){
            System.out.println("Kan ikke lokalisere driver");
            System.out.println(e.getMessage());
        }
        try{
          //forbindelse til databasen
            //  con = DriverManager.getConnection(url, bruger, passwd);
            con = DriverManager.getConnection("jdbc:mysql://localhost/file_super");

            dma = con.getMetaData(); //få fat i meta data
            System.out.println("Forbindelse til " + dma.getURL());
            System.out.println("Driver " + dma.getDriverName());
        }//slut try
        catch(Exception e){
            System.out.println("Problemer med forbindelse til databasen");
            System.out.println(e.getMessage());
        }//slut catch
      }
      public void closeDb(){
      try{
          con.close();
      }
      catch (Exception e){
          System.out.println("Fejl ved lukning " +  e.getMessage());
      }   
      }
      public static Connection getDBcon(){
          return con;
      }
     
      public int insert(String name, String timestamp, String changed, String size, int week)
      {
        int rc=-1;
        String query="INSERT INTO fileinfo VALUES('" + name + "', '" + timestamp + "', '" + changed + "', '" + size + "', 'null', "  + week + ")";
          try{
                  Statement stmt = con.createStatement();
                  rc = stmt.executeUpdate(query);
           
              }   
              catch(Exception ex){
                  System.out.println("Insert exception i db: "+ex);
              }
          return(rc);
        }
    }
}

--------------------------------

Hvis der er nogen der har en bedre ide' til hvordan at man stopper brugeren fra at kunne lukke det ned.. helt og aldeles... skal ikke engang kunne trykke på krydset.... så er jeg åben for forslag med vedhæftede eksempler.. ;)

btw.. nogen af jer der ved hvordan man let og hurtigt får en long (timeinmillis) over i et dato objekt efter eget valg hvad format angår??
Avatar billede arne_v Ekspert
29. september 2003 - 21:17 #9
class Main
{
    public static void main(String [] args)
    {
        Counter tråd=new Counter();
        tråd.start();
        // gør noget mens tråd kører
        tråd.join();
        // gør noget efter tråd er færdig
    }
}
Avatar billede arne_v Ekspert
29. september 2003 - 21:18 #10
long t;
Date d = new Date(t);

laver et Date objekt.

DateFormat df = new SimpleDateFormat("et eller andet format");
String s = df.format(d);

laver en streng i det format du vil have.
Avatar billede thums Praktikant
29. september 2003 - 21:19 #11
Hvad gør .join() arne??
Avatar billede arne_v Ekspert
29. september 2003 - 21:19 #12
String fraFolder="c://Java//Projekter//Counter/fra";
String tilFolder="c://Java//Projekter//Counter/til";

undrer mig list.

Man bruger normalt \\ eller / - ikke //.
Avatar billede arne_v Ekspert
29. september 2003 - 21:20 #13
join() venter på at tråden kører færdig.
Avatar billede thums Praktikant
29. september 2003 - 21:21 #14
btw...

java.util.Date date = new java.util.Date();
        SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy HH:mm");
        System.out.println(""+format.format(date));

en simpel måde at klare formatteringen på af millis
Avatar billede thums Praktikant
29. september 2003 - 21:22 #15
Arne... det er fordi at jeg skal have to mapper.. en hvor brugeren ligger filerne.. og en anden hvor programmet skal ligge filerne over og slette dem i den gamle
Avatar billede thums Praktikant
29. september 2003 - 21:25 #16
Arne.. men hvordan hjælper join() mig når jeg enten skal have applikationen til at køre i baggrunden hele tiden eller bare som daemon... den skal jo aldrig lukke ned
Avatar billede arne_v Ekspert
29. september 2003 - 21:27 #17
Hvis du kører programmet som

javaw Main

i stedetfor

java Main

så laver det ikke noget vindue og brugeren har ikke noget vindue at klikke
kryds på.

[den kan stadigvæk stoppes i task manager]
Avatar billede arne_v Ekspert
29. september 2003 - 21:28 #18
join hjælper dig ikke med dæmon eller ej - kun til at vide om din tråd er færdig
eller ej.
Avatar billede arne_v Ekspert
29. september 2003 - 21:29 #19
Og hvis programmet skal køre permanent, så lad det bare aldrig afslutte.
Avatar billede thums Praktikant
29. september 2003 - 21:31 #20
AHHH!!!!!... mange Takker.. :)

vil lige kigge lidt mere på det med join().. kan det være at daemon lukkede ned fordi jeg ikke havde den??
Avatar billede thums Praktikant
29. september 2003 - 21:31 #21
btw arne... smid lige et svar.. du har så rigeligt fortjent dine point.. :)
Avatar billede arne_v Ekspert
29. september 2003 - 21:36 #22
tråd.setDaemon(true) og ingen tråd.join() får hoved-tråden til at afslutte
og JVM til at slå den anden tråd ihjeld.
Avatar billede arne_v Ekspert
29. september 2003 - 21:36 #23
svar
Avatar billede thums Praktikant
29. september 2003 - 21:38 #24
Takker... dejligt at blive klogere... :)

men som en klog mand engang sagde.... "Man er først i sandhed vis det øjeblik man indser at man ved uendeligt lidt"
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester