Cocoa GUI für Scanimage --> Wie NSTask beenden??

W

Wallnusskaese

Neues Mitglied
Thread Starter
Dabei seit
25.10.2013
Beiträge
6
Reaktionspunkte
1
Guten Tag allerseits,
ich würde euch gerne mein erstes Cocoa-Projekt vorstellen und brauche dabei Hilfe an diversen Ecken des Codes.
Aktuell besonders dabei, wie ich die angestoßenen Prozesse über die GUI wieder beenden kann.

Das Ziel: Entwicklung einer GUI für das Kommandozeilen-Tool Scanimage mittels Cocoa/Objective C.

seit ich mir für ein paar Euros einen HP-Scanjet 5550c geschossen habe, beschäftige ich mich mit der Frage, wie ich diesen am besten nutzbar machen kann. Da ich meinen Drucker im Netzwerk habe war mein Ziel, den Scanjet ebenso über das Netzwerk zu betreiben. Hierzu fiel meine Wahl auf das Sane-projekt (http://www.sane-project.org/). Mein Router (Asus RT-N16 mit Tomato firmware) fungiert hierbei als Sane-Server. Unter Windows funktioniert das Setup über xsane und selbst über Android funktioniert's mit Sanedroid. Nur mit OSX konnte ich nicht scannen, wie ich hier schon einmal ausgeführt hatte https://www.macuser.de/forum/thema/703783-TWAIN-SANE-Interface-Netzwerkscanner-Mavericks.

Wozu erzähle ich jetzt das Ganze noch mal? Ganz einfach, weil Scanimage der einzige Weg ist, von meinem Macbook zu scannen. Da dies auch wunderbar funktioniert, viele Funktionen bietet, aber halt alles andere als bedienungsfreundlich ist, habe ich beschlossen eine GUI dafür zu basteln.

(ich weiß es gibt Snac, das funktioniert aber mit meinem 5550c irgendwie nicht recht und kann darüber hinaus nicht über den ADF scannen.)

Aktueller Stand der Dinge:

Gui.jpg
Alles funktioniert auch soweit.


Funktionsweise:

Das Programm funktioniert derzeit so: Wird der Scan-button gedrückt, wird aus den eingegebenen Parametern ein String zusammengebaut, der quasi ein shellscript enthält.
1. Es werden im Format tiff so viele Seiten wie angegeben in einen temporären Ordner gescannt.
2. Die gescannten Seiten werden mit SIPS ins Zielformat konvertiert und ins Zielverzeichnis geschrieben.
3. Die temporären Dateien werden gelöscht.

Das Problem:
Das funktioniert, allerdings verliere ich damit die Kontrolle.

- Ist der Scan Vorgang gestartet, lässt er sich nicht unterbrechen.


Der Code:
Das passiert beim drücken des Scanbuttons:

Code:
  - (IBAction)bScan:(id)sender {    
    //Benötigte Vars 
    NSString *tempdir =@"/tmp/";
    NSString *name =@"";
   
    NSString *pathtoscanimage =@"/usr/local/bin/scanimage ";
    NSString *format =@""; //=@"tiff ";
    NSString *devname =@"";
    NSString *batch =@""; //=[@"--batch " stringByAppendingString:out];
    NSString *batchstart =@""; //=@"--batch-start=1 ";
    NSString *batchcount =@""; //=@"--batch-count=1 ";
    NSString *batchincrement =@""; //=@"--batch-increment=1 ";
    NSString *saveto =@"";
    
    //Device Specific
    NSString *mode =@""; //=@"--mode Lineart "; // Color/Gray/Lineart
    NSString *source =@""; //=@"--source Flatbed "; //ADF
    NSString *resolution =@""; //=@"--resolution 100 ";
   // NSString *preview =@""; //=@"--preview ";
    
    NSString *scantemp =@"";
    NSString *converttemp =@"";
    NSString *deltemp =@"";
    NSString *scantotal =@"";
 
    
    //Einstellungen abfragen
    mode= [self getMode];
    format=[self getFormat];
    resolution=[self getDPI];
    source=[self getSource];
    saveto=[self.tfsaveto stringValue];
    name=[self.tfName stringValue];
    
    batchcount=[self.tfBatchCount stringValue];
    batchstart=[self.tfBatchStart stringValue];
    batchincrement=[self.tfBatchIncrement stringValue];
 
    
    //Batch-(teil)String zusammenbauen
    batch = [NSString stringWithFormat:@"%@%@%@%@%@%@%@", @"--batch --batch-start=",batchstart,@" --batch-count=",batchcount,@" --batch-increment=",batchincrement,@" "];
    
    //Scanstring in den temporäten Ordner zusammenbauen
    scantemp = [NSString stringWithFormat:@"%@%@%@%@%@%@%@", pathtoscanimage, @"--format=tiff ",devname,batch,mode,source,resolution];
    
    //Teilstring für Konvertierung in Zielordner + löschen aus temp-Ordner zusammenbauen
    int n = batchcount.intValue;
    int j = batchstart.intValue;
    int incr = batchincrement.intValue;
    int number = 0;
    NSString *nn=@"";
    
        //In jedem Durchlauf wird der Befehl zum Konvertieren und löschen einer Datei an den nn-String angehangen.
    for (int i=1; i<=n; i++) {
        if (i==1) {             //wenn i==1 --> erster Durchlauf Nummerierung startet be "batchstart"
            number=j;
        } else {                //sonst bei "batchstart"+("Durchlauf"-1)*"increment"
            number = (i-1)*incr+j;
        }
        //Konvertierungsbefehl für aktuelles i zusammenbauen || Konvertierung mittels SIPS
        converttemp = [NSString stringWithFormat:@"%@%@%@%@%@%d%@%@%@%@%d%@%@%@",@" ; sips -s format ",format, @" '", tempdir, @"out",number,@".tif' --out '",saveto,@"/",name,number,@".",format,@"'"];
        
        //löschstring für aktuelles i zusammenbauen
        deltemp =[NSString stringWithFormat:@"%@%@%@%d%@",@" ; rm '",tempdir,@"out",number,@".tif'"];
        
        //i. Konvertier- und löschstring an nn anhängen.
        nn=[NSString stringWithFormat:@"%@%@%@",nn,converttemp,deltemp];
    }
    
    //Finalen Befehlsstring zusammenbauen
    scantotal = [NSString stringWithFormat:@"%@%@",scantemp,nn];
   
    //Den nächsten Scan bei start+batch starten
    [self.tfBatchStart setStringValue:[NSString stringWithFormat:@"%d",number+1]];
    
    //debug
    NSLog([ NSString stringWithFormat:@"%@%@%@",@"Scantotal Debug String: ",scantotal,@" Output des NSTask:"]);
    
    //Task ausführen
    NSTask *task =[[NSTask alloc] init];
    [task setLaunchPath:@"/bin/sh"];
    [task setCurrentDirectoryPath:tempdir];
    [task setArguments:@[@"-c",scantotal,@"nil"]];
    [task launch];
    
    
   
    
    //einstellungen speichern
    [self setIntForKey:self.scDPI.selectedSegment :@"DPI"];
    [self setIntForKey:self.scFormat.selectedSegment :@"Format"];
    [self setIntForKey:self.scScanmode.selectedSegment :@"Scanmode"];
    [self setIntForKey:self.scSource.selectedSegment :@"Source"];
    [self setStringForKey:self.tfBatchCount.stringValue :@"BatchCount"];
    [self setStringForKey:self.tfBatchIncrement.stringValue :@"BatchIncrement"];
    [self setStringForKey:self.tfBatchStart.stringValue :@"BatchStart"];
    [self setStringForKey:self.tfName.stringValue :@"Name"];
    [self setStringForKey:self.tfsaveto.stringValue :@"SaveTo"];
    
    
    
}

Wie kann ich jetzt also das ganze abbrechen?


MfG,

Wk

 
Klappt das denn jetzt oder war der Tipp nicht korrekt? Feedback ist immer hilfreich für andere...
 
  • Gefällt mir
Reaktionen: Wallnusskaese
hey ruerueka, bin leider die Woche ziemlich ausgelastet und werd wahrscheinlich erst am Wochenende dazu kommen zu testen. Berichte dann :)

lg.

wk
 
  • Gefällt mir
Reaktionen: ruerueka
terminate klappt wunderbar... vielen dank für den Tipp!
 
Zurück
Oben Unten