|
tolarion wrote: Somehow it must be possible to combine the jobs
I wouldn't expect it to be possible. Think of it this way. Open a command prompt and type COPY WordDoc1.docx + WordDoc2.docx WordDoc.docx , then try and open the WordDoc.docs file. It's not going to work because each doc has it's own header, formatting tables, tail details, checksums, ... which are now no longer valid.
You'd have to read the job streams, interpret the contents of all the jobs, create a new job, reformat the data from all of the jobs you want to combine into a single job with all the data ini the correct places. For example, you can't have the headers from each job spread throughout the target job. The data for each must be combined into a header that is at the beginning of the job and reformatted so that it makes sense.
Oh, and you'd have to put in the details to tell the printer to staple in the correct place and orientation, because I'm guessing that you didn't tell each job to staple.
In short, doing this is a HUGE undertaking.
|
|
|
|
|
The EMF Files are not the same as the WordDoc i think ... it's a kind of Vector Format for each page with BeginPage / EndPage BeginDoc / EndDoc ... so i try to do exactly what you described with the spooling ... and open it with a EMF viewer (Articles/10586/EMF-Printer-Spool-File-Viewer) ... and it worked. The information on page etc are unfortunately lost ... but i give it a hope that it is not so HUGE undertaking as you mid think ?!
Perhaps i need is some kind of EMF reformatting ... getting each single page out of the spool file. Stacking theme again and writing all to the new spool or just print it again ...
The stapling is done by the printer driver ...
But my problem is still: how to get the right spooling filename ! Can not read it from PrintSystemJobInfo ?!
|
|
|
|
|
tolarion wrote: BeginDoc / EndDoc
OK, so is it legal to have more than one pair of Begin/End Doc tags in the same job?
The problem with obtaining the filename is that the Win32 Spooler API doesn't provide it. All you get is a handle to the spool file, which you cannot touch until the job is complete. That's why you only get a Stream object from PrintSystemJobInfo.
|
|
|
|
|
You are right shouldn't be legal, but it works. I certainly will read the files on after the other ... if i get the Filename or a filled JobStream. I only need the Filename because the Stream object is always empty ... regardless of rights and printer type. Could be many files in a spool, so reading each and looking for the jobname would be digging to deep. Anny idea ?!
|
|
|
|
|
The only way to get the filename would be to get the handle that Win32 exposes to you, see the GetSpoolFileHandle[^] function, then enumerate the system handle table, looking for the handle returned, and get the filename. This is a very expensive operation to perform and by the time you get the filename the Spooler may have already closed the file and deleted it.
|
|
|
|
|
Thanks for your help, i will try GetSpoolFileHandle, but i am not sure how to get the system handle table and from there the filename ... and the file will still be there cause i stoped the Queue by using
Dim ps As New PrintServer(serverName, PrintSystemDesiredAccess.AdministrateServer)
Dim queue As New PrintQueue(ps, printerName, PrintSystemDesiredAccess.AdministratePrinter)
queue.Pause()
and after my operations i will start it again
queue.Resume()
Why could it not be all in system.printing ... now i must play around with pinvoke ...
|
|
|
|
|
Enumerating the system file handles requires admin permissions. Unless you're giving your app to a bunch of administrator user account (REALLY bad idea!), you're not going to be able to do this. This is NOT an operation typically done for printing. This is a technique usually used to diagnose system problems.
Quote:
tolarion wrote: and the file will still be there cause i stoped the Queue
Don't count on it.
tolarion wrote: Why could it not be all in system.printing ... now i must play around with pinvoke ...
The filename isn't supplied because Windows doesn't supply any method to get it. It has nothing to do with .NET. .NET is limited by the limitations in Windows.
modified 27-Jun-13 14:05pm.
|
|
|
|
|
Accessing the system spool needs admin permission, so i am already on that way ... not happy with it but we are on a Windows system not on Linux ... so everything needs admin ...
... and ... everything should be in a service, now i realized that printing from a service is *$&*# ... sorry ... but is there a other way ... in some forums they use PDF to print to and then combine the PDF and print it ... some SDKs are available, so there must be a way doing it ... i am not the one who gives up early ... but time is running away
|
|
|
|
|
I give up accessing the spool ... dave is right ... its a waste of time ...
Now i use pdfsharp.com[^]
Printing on a PDF Printer >> Combine the PDF >> Print the combined PDF on the HP9000 ... should be easy ?!
Hope this works out for me ... unfortunately i must use Acrobat Reader for printing ... but therefor it is free !
|
|
|
|
|
tolarion wrote: Printing on a PDF Printer >> Combine the PDF >> Print the combined
PDF on the HP9000 ... should be easy ?!
Doesn't that have the same problem as a docx file?
Open a command prompt and type COPY WordDoc1.docx + WordDoc2.docx WordDoc.docx, then try and open the WordDoc.docs file.
There's no "easy" way to achieve what you're trying. If it needs be done from several clients, then your best option would be to write your own device-driver. That would be done in an unmanaged language, not in .NET.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
|
Cool
|
|
|
|
|
I'm designing an application which consist of multiple clients that connect to a server using sockets. I'm trying to figure out a way to monitor the connection and if no data is transferred within a certain time from (say 1 minute) then the connection is closed (basically I'm trying to create a watchdog timer).
From what I've been reading it seems that I would need to use the AutoResetEvent class. The way I envisioned it working is that every time the server receives data from a client it resets the timer of the AutoResetEvent.WaitOne. What I've come up with so far is something like this in the server application:
Dim autoEvent as New AutoResetEvent(False)
If autoEvent.WaitOne(1000) Then
autoEvent.Reset
Else
Close connection and inform user
End If
When the socket receives data it will call autoEvent.Set which will cause the autoEvent.Reset method to be called. This would obviously be started on a new thread so it wouldn't block the main thread handling the data.
Is this correct or is there a better way to do this? Any links to creating a watchdog timer would be appreciated also. Thanks in advance for any help with this.
|
|
|
|
|
That seems like the best way to do it to me. BTW, your timeout is set to 1 second, not 1 minute. That could be for testing purposes. Just sayin'...
|
|
|
|
|
The timeout I just wrote that for the purposes of the post. When the autoEvent.Reset is called (as a result of autoEvent.Set being called), will the code in essence jump back to the autoEvent.WaitOne or will the code jump to after the If...Then...Else block?
|
|
|
|
|
|
Hi guys this is simple but I'm a novice trying to cache the getMyresult function but I'm struggling to find the code to do so, could you help please? . I don't want the answer just some of the methods and syntax.
Sub Main
console.writeline(getmyresult(2))
console.writeline(getmyresult(3))
console.writeline(getmyresult(2))
console.writeline(getMyresult(3))
End Sub
function getMyresult(X as interger) as integer
dim Y as integer=LongCompute(X)
return Y
end function
function LongCompute(X as integer) as integer
system.threading.thread.sleep(1000)
return x^2
end function
modified 20-Jun-13 14:00pm.
|
|
|
|
|
GetMyResult has to maintain it's own cache of result values. Create a collection to store Key/Value pairs, usually a Dictionary(Of Integer, Integer). The Key value will be the integer you pass in and the result will be the value returned by LongCompute.
Basically, when GetMyResult is called, it uses the value passed in to search the Dictionary for that value. If it's found, it can return the value associated with that key. If it's not found, then you call LongCompute with the passed in value, get the result, and add the new key/value pair to the dictionary. Lastly, return the result back to the caller.
|
|
|
|
|
Just curious Dave and Poster, but what does this mean in context - "cache"? I guess the simplicity of the code has me puzzled - two-stepping for a single computation. I can't see beyond that. I use a dictionary and actually truly cache with the class. Purpose?
|
|
|
|
|
To hold a table of values that have already been computed so you don't have to run through a potentially time-consuming calculation again to return the same value for the given input.
|
|
|
|
|
Exactly the same way that I do on the accounting side of my apps, but I exlicitly set out to cache. Sorry to inject! I had curiosity get the best of me as I was looking at the code and realizing that it is a textbook example has answered the question. Once again, sorry! Thanks for the replies, and let me know if you solve the threading problem. LOL ... Attempted multitasking this day.
modified 27-Jun-13 20:11pm.
|
|
|
|
|
Threading problem?? What threading problem??
|
|
|
|
|
|
Because his code is an example!
|
|
|
|
|
Dear Dave,
Many thanks for explaining it to me as well instead of just giving me the code,
My teacher will be impressed haha
Many Thanks
101
|
|
|
|