2012-07-03 25 views
4

對於我的父母,我正在編寫一個簡單的程序,將文件從其數字照相機複製到他們的「我的文檔」文件夾中。他們總是需要我的幫助(他們技術不太先進),以便將他們的照片從相機中取出,所以我決定幫助他們。我稱之爲複印機。因爲我找不到在Java中合適的USB-監聽器,我寫了一個自己:隱藏在SystemTray中的Java線程停止

private void sync() 
{ 
    // All devices in an ArrayList 
    File[] roots = File.listRoots(); 
    ArrayList<File> newList = new ArrayList<File>(); 
    for(File f : roots) 
    { 
     newList.add(f); 
    } 

    // Delete unavailable devices 
    ArrayList<File> removeThese = new ArrayList<File>(); 
    for(File f : devices) 
    { 
     if(!newList.contains(f)) 
     { 
      removeThese.add(f); 
     } 
    } 
    devices.removeAll(removeThese); 

    // Add unknown devices 
    for(File f : newList) 
    { 
     if(!devices.contains(f) && f.canRead() && f.canWrite()) 
     { 
      alarm(f); // Called when new device inserted 
      devices.add(f); 
     } 
    } 
} 

這種方法被稱爲在一個單獨的線程每1000毫秒,我想,會做。承認,這是一個骯髒的方法,但它的工作原理。我經常測試這個功能,我總是有我想要的結果。當我繼續構建我的程序時,我發現當我將程序隱藏到SystemTray時,線程將停止檢測新設備。當我再次打開時,檢測線程仍然無法工作。有誰能告訴我這是什麼原因以及如何解決?

+0

而不是每1000毫秒調用它只是寫一個.bat文件,調用它並將其放置在他們的桌面上。我相信即使他們沒有那麼科技,他們也可以做'雙擊') – alfasin

+0

看起來,編寫計算機驅動程序並將其安裝到父母身上似乎不會那麼麻煩。 :D – Wug

+0

看看輪詢線程啓動點會發生什麼。莫名其妙地被打斷了? – Wolfgang

回答

2

保存用戶插入的數據後,我停止檢測新設備。這很愚蠢,所以我感謝你讓我意識到這一點。

public boolean saveSettings() 
{ 
    File f = new File(fsv.getHomeDirectory() + File.separator + "settings.cms"); 
    ObjectOutputStream objOut; 
    try 
    { 
     // Here was my problem. 
     detector.stopDetection(); 

     if(gui.saveSettings()) 
     { 
      // Settings-file wegschrijven 
      objOut = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(f))); 
      objOut.writeObject(settings); 
      objOut.flush(); 
      objOut.close(); 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    catch (IOException e) 
    { 
     handleExceptions(e); 
     return false; 
    } 
}