2010-07-02 140 views
3

我寫了一個叫php的小片段,用於在預定義的網絡打印機上打印.postscripts文件。Java打印和多線程

雖然我只打印一個文件,但一切順利,但是當我嘗試設置多線程打印管理時,一次向打印機發送多個文件,只有第一個文件出來。

的問題是,PrintJobEvent PrintJobEvent.JOB_COMPLETEPrintJobEvent.JOB_FAILED不會發生,並通過後臺打印程序發回的唯一事件是DATA_TRANSFER_COMPLETENO_MORE_EVENTS

我搜索了網絡和Sun論壇,但沒有辦法找到答案。感謝您之前的任何幫助:)

最後的編輯:如果我運行通過NetBeans調試模式下的應用程序,我手動中斷第一個線程,第二個文件發送到打印機...所以我假設它必須工作

+0

一些代碼如何? – 2010-07-02 20:08:33

回答

3

將多個文件並行發送到打印機確實沒有意義。爲什麼不創建一個隊列並將作業發送到一個線程,該線程將從隊列中順序讀取數據,然後將結果發送到打印機。如果不是,則需要序列化輸出。

您也可能遇到在多線程上初始化打印機的問題。

打印機一次只能打印一份作業。

1

對不起延遲迴答,但是我在這裏:)

所以一些修改後,我試圖建立一個隊列就像你說的,一個線程等待前一個文件是打印機管理,但問題是,打印機永遠不會將我的作業完成/失敗/取消。

我在網上搜索了所有內容,沒有辦法找到這個問題的答案。

我也試着開關打印機(永遠不知道...),結果是一樣的,發回的唯一事件是DATA_TRANSFER_COMPLETE和NO_MORE_EVENTS ...

由於以前。

順便說一句,這裏的代碼我其實運行:

的PrintService

package print; 

import java.io.BufferedInputStream; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import javax.print.Doc; 
import javax.print.DocFlavor; 
import javax.print.DocPrintJob; 
import javax.print.PrintService; 
import javax.print.PrintServiceLookup; 
import javax.print.SimpleDoc; 

public class MyPrintService extends Thread { 

    String name; 

    public MyPrintService(String name) 
    { 
     super(name); 
     this.name = name; 
     System.out.println("MyPrintService("+this.name+")"); 
     this.start(); 
    } 

    public void print() 
    { 
     System.out.println("print()"); 

     try { 

      for (int i = 1; i < 3; i++) { 

       // Open the image file 
       InputStream is   = new BufferedInputStream(new FileInputStream("D://giulio.provasi//Desktop//"+i+".txt")); 
       PrintService service = PrintServiceLookup.lookupDefaultPrintService(); 

       // Create the print job 
       DocPrintJob job   = service.createPrintJob(); 
       Doc doc     = new SimpleDoc(is, DocFlavor.INPUT_STREAM.AUTOSENSE, null); 

       // Monitor print job events 
       PrintJobWatcher pjDone = new PrintJobWatcher(); 

       job.addPrintJobListener(pjDone); 

       // Print it 
       job.print(doc, null); 

       // Wait for the print job to be done 
       pjDone.waitForDone(); 

       while(i < 10000000) { 
        System.out.println("le thread n'a pas attendu !"); 
        i++; 
       } 

       // It is now safe to close the input stream 
       is.close(); 
      } 
     } catch (Exception e) { 
     } 
    } 

    @Override 
    public void run() 
    { 
     System.out.println("run("+this.name+")"); 
     this.print(); 
    } 
} 

打印監聽

package print; 

import javax.print.event.PrintJobEvent; 
import javax.print.event.PrintJobListener; 

public class PrintJobWatcher implements PrintJobListener { 

    Boolean done = false; 
    Integer status = 0; 

    PrintJobWatcher() 
    { 
     System.out.println("PrintJobWatcher()"); 
    } 

    @Override 
    public void printDataTransferCompleted(PrintJobEvent pje) 
    { 
     this.done(PrintJobEvent.DATA_TRANSFER_COMPLETE); 
     System.out.println("DATA_TRANSFER_COMPLETE"); 
    } 

    @Override 
    public void printJobCompleted(PrintJobEvent pje) 
    { 
     this.done(PrintJobEvent.JOB_COMPLETE); 
     System.out.println("JOB_COMPLETE"); 
    } 

    @Override 
    public void printJobFailed(PrintJobEvent pje) 
    { 
     this.done(PrintJobEvent.JOB_FAILED); 
     System.out.println("JOB_FAILED"); 
    } 

    @Override 
    public void printJobCanceled(PrintJobEvent pje) 
    { 
     this.done(PrintJobEvent.JOB_CANCELED); 
     System.out.println("JOB_CANCELED"); 
    } 

    @Override 
    public void printJobNoMoreEvents(PrintJobEvent pje) 
    { 
     this.done(PrintJobEvent.NO_MORE_EVENTS); 
     System.out.println("NO_MORE_EVENTS"); 
    } 

    @Override 
    public void printJobRequiresAttention(PrintJobEvent pje) 
    { 
     this.done(PrintJobEvent.REQUIRES_ATTENTION); 
     System.out.println("REQUIRES_ATTENTION"); 
    } 

    private synchronized void done(Integer status) 
    { 
     System.out.println("DONE !"); 
     this.status = status; 
     this.done = true; 
     notifyAll(); 
    } 

    synchronized void waitForDone() 
     throws InterruptedException 
    { 
     System.out.println("AVANT : IMPRESSION EN COURS..."); 
     try { 
      while (!this.done || ((this.status != PrintJobEvent.JOB_COMPLETE) || (this.status != PrintJobEvent.JOB_FAILED))) { 
       System.out.println("IMPRESSION EN COURS..."); 
       wait(); 
      } 
     } catch (InterruptedException e) {} 
    } 
} 

啓動

import print.MyPrintService; 


public class Main { 

    public static void main(String[] args) 
    { 
     System.out.println("C'est parti !"); 
     MyPrintService test1 = new MyPrintService("1"); 
    } 
} 
+0

你有沒有遇到過這樣的解決方案? – DynaWeb 2017-10-27 20:45:24