| 

.NET C# Java Javascript Exception

1
Hallo,

ich erstelle mir in meinem Windows.Forms Programm eine Zusammenfassung als Word-Dokument (2003). Ich möchte dem Benutzer zusätzlich die Möglichkeit bieten das Dokument aus zu drucken. Habe auch einen Weg (siehe unten) gefunden, allerdings funktioniert dieser nicht zuverlässig. Drucke ich im main-thread wird zwar alles aufgerufen, man sieht das der druckauftrag gesendet wird, allerdings wohl nicht vollständig, gedruckt (oder bei pdf-printer gespeichert) wird nicht. Verwende ich eine Lösung mit 2 Threads (hintergrund thread druckt) hängt es davon ab wie schnell der Hintergrund-Thread nach dem Aufruf beendet wird. Jenachdem reicht die Zeit den Auftrag vollständig zu senden oder nicht.
Da ich nun keine dreckige Lösung alla Thread.sleep(1000) anstrebe, frage ich nun euch ob ihr eine Idee habt, wie ich es schaffen kann, dass der Druckauftrag definitiv ankommt.

1. Thread:
Word.Dialog dlg = word.Dialogs[Word.WdWordDialog.wdDialogFilePrint];
object timeOut = 0;
int retValue = dlg.Show(ref timeOut);


2. Threads:
AutoResetEvent autoEvent = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(printSummary), autoEvent);

// Wait for background thread to end.
autoEvent.WaitOne();



static void printSummary(object stateInfo)
{

Word.Application word = Helperz.getWordApplication();

Word.Dialog dlg = word.Dialogs[Word.WdWordDialog.wdDialogFilePrint];
object timeOut = 0;
int retValue = dlg.Show(ref timeOut);

if (retValue == -1)
{
//System.Windows.Forms.MessageBox.Show("print job started!");


}
else
{
//cancelled
}



// Signal that this thread is finished.
((AutoResetEvent)stateInfo).Set();

}
News:
23.09.2009
Fox33299729 21 1 3
2 Antworten
1
Probier doch einfach das Drucken über PrintOut.

Oder checke im Background-Thread den BackgroundPrintinStatus. Laut MSDN ist das allerdings nicht angedacht.
23.09.2009
stj 326 1 2
Danke für die Antwort.

PrintOut verhält sich gleich...

Also meine word-application verwendet diesen
[url=http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word._application.backgroundprintingstatus.aspx]BackgroundPrintinStatus[/url]

Also eine Lösung, aber 100% zufrieden bin ich damit noch nicht.
[CODE]
Word.Dialog dlg = word.Dialogs[Word.WdWordDialog.wdDialogFilePrint];
object timeOut = 0;
int retValue = dlg.Show(ref timeOut);

int numberOfPrintDocs = word.BackgroundPrintingStatus;

while(numberOfPrintDocs == word.BackgroundPrintingStatus){
[/CODE]
Fox33299729 23.09.2009
0
Welches Threading Model benutzt du in deiner Anwendung? Apartment oder MultiThreading?
Anders herum: Ruft du die Funktion CoInitializeEx(), und wenn ja wie. COM programming und MultiThreading ist ein Albtraum. Darüber gibt es tonnenweise Doku, aber leicher wird es dadurch nicht. Ein Einstieg findest du hier: MSDN. Ich weiß nicht, ob dein konkretes Problem damit zu tun haben kann, aber bei MultiThreading und COM schrillen mir immer die Alarmglocken.
23.09.2009
BeachBlocker 617 3
Okay, mir fehlt wohl etwas background-wissen was COM angeht.

Zu Frage: Wenn ich es richtig verstanden habe, weder noch, die Zuordung wird automatisch gemacht.

Nochmals zu verdeutlichung: ich verwende MSO 2003 Primary Interop Assemblies. Der Druckaufruf wird aktuell vom MainThread (UI-Thread, siehe Lösung oben Thread 1, ausgeführt. Zu diesem Zeitpunkt ist die Applikation single-threaded.

Was dann im Hintergrund bei der Variante mit 2 Threads passiert (beide verwenden das gleiche Word-Objekt) ist mir noch nicht ganz klar.
Fox33299729 23.09.2009
Es schadet nicht, in allen Threads am Anfang CoInitializeEx() aufzurufen: Wenn die Funktion S_OK returned war das Threading zuvor nicht gesetzt und die Funktion mußte gerufen werdenn; wenn S_FALSE returned wird, dann war der Modus schon gesetzt, und das Problem liegt voranders; wenn RPC_E_CHANGED_MODE returned wird, dann ist ein anderer Modus bereits gesetzt.
BeachBlocker 23.09.2009

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH