First I don't know if this can even be done but I have an idea.
I am using Microsoft's MODI command line to OCR a file. On occasion MODI will lock up. This is not uncommon with OCR engines when they find a page that cannot be processed.
When it happens in MODI there are numerous things that can happen, Or should I say different error messages will appear depending upon the error.
So the plan is to set a timer, see if the process is running (MODI) if it has run to long kill it. This I have built in and it works. However, yes I am getting to the point. The Process is using 100 percent of the CPUs resources according to the task manager and because of this the timer is not working correctly. If a file is being processed correctly one second is close to one second. When it locks up the 1 second wait could be 15 or twenty seconds. This would not be a big deal, but when the wait time is set for 3 minutes and each second is fifteen times longer it is 15 minutes which is an issue.
So, I am looking for a work around. I know in the task manager you can set priorties, so I was thinking that perhaps if the script (it is compiled) is set to a high priority the counter may work better. It may not as well, but it is all I can think of trying. So, does anyone know how to change the process priority in a script? or have another suggestion.
Note the value TO is what the time out function is set to. The various processes it checks are reltated to MODI and error messages from Microsoft.
Let>t=0
ChangeDirectory>%modipath%
Let>RP_WAIT=0
RunProgram>"%MODIProgram%" %s% "%tempdir%\%thefilename%"
Label>checkforerror
VBEval>IsProcessRunning("MSPView.exe"),res
If>res=0
Goto>OCRDone
Endif
Wait>.5
Let>t=%t%+1
If>%t%=%TO%
Goto>Kill_entire_File_OCR
Else
Goto>checkforerror
Endif
Label>Kill_entire_File_OCR
VBEval>IsProcessRunning("MSPView.exe"),res
If>res>0
VBRun>KillProcess,MSPView.exe
Endif
VBEval>IsProcessRunning("dwwin.exe"),res
If>res>0
VBRun>KillProcess,dwwin.exe
Endif
VBEval>IsProcessRunning("dw20.exe"),res
If>res>0
VBRun>KillProcess,dw20.exe
Endif
VBEval>IsProcessRunning("dumprep.exe"),res
If>res>0
VBRun>KillProcess,dumprep.exe
Endif
etc.
Control Process Priority - timer on lockups
Moderators: JRL, Dorian (MJT support)
Use a batch file to launch the MODI command line using the "START" command and give it a low priority. You could also launch the Macro Scheduler this way with a high priority (compiled or not).
Starts a separate window to run a specified program or command.
START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/WAIT] [/B] [command/program]
[parameters]
"title" Title to display in window title bar.
path Starting directory
B Start application without creating a new window. The
application has ^C handling ignored. Unless the application
enables ^C processing, ^Break is the only way to interrupt
the application
I The new environment will be the original environment passed
to the cmd.exe and not the current environment.
MIN Start window minimized
MAX Start window maximized
SEPARATE Start 16-bit Windows program in separate memory space
SHARED Start 16-bit Windows program in shared memory space
LOW Start application in the IDLE priority class
NORMAL Start application in the NORMAL priority class
HIGH Start application in the HIGH priority class
REALTIME Start application in the REALTIME priority class
ABOVENORMAL Start application in the ABOVENORMAL priority class
BELOWNORMAL Start application in the BELOWNORMAL priority class
WAIT Start application and wait for it to terminate
command/program
If it is an internal cmd command or a batch file then
the command processor is run with the /K switch to cmd.exe.
This means that the window will remain after the command
has been run.
If it is not an internal cmd command or batch file then
it is a program and will run as either a windowed application
or a console application.
parameters These are the parameters passed to the command/program
If Command Extensions are enabled, external command invocation
through the command line or the START command changes as follows:
non-executable files may be invoked through their file association just
by typing the name of the file as a command. (e.g. WORD.DOC would
launch the application associated with the .DOC file extension).
See the ASSOC and FTYPE commands for how to create these
associations from within a command script.
When executing an application that is a 32-bit GUI application, CMD.EXE
does not wait for the application to terminate before returning to
the command prompt. This new behavior does NOT occur if executing
within a command script.
When executing a command line whose first token is the string "CMD "
without an extension or path qualifier, then "CMD" is replaced with
the value of the COMSPEC variable. This prevents picking up CMD.EXE
from the current directory.
When executing a command line whose first token does NOT contain an
extension, then CMD.EXE uses the value of the PATHEXT
environment variable to determine which extensions to look for
and in what order. The default value for the PATHEXT variable
is:
.COM;.EXE;.BAT;.CMD
Notice the syntax is the same as the PATH variable, with
semicolons separating the different elements.
When searching for an executable, if there is no match on any extension,
then looks to see if the name matches a directory name. If it does, the
START command launches the Explorer on that path. If done from the
command line, it is the equivalent to doing a CD /D to that path.
Another option might be to use a vbscript timer in a loop to wait rather than using the built in Wait> function. I have not tested this in a 100% CPU usage condition but I would expect this to "wait" no more than a few seconds longer than the supplied seconds rather than 15 times longer than the supplied seconds
Code: Select all
//Usage:
//GoSub>VB_Wait,Number of seconds to wait
GoSub>VB_Wait,180
SRT>VB_Wait
VBSTART
VBEND
VBEval>timer,VB_Wait_StartTime
Label>VB_Wait_Start
//Wait is optional
Wait>0.01
VBEval>timer-%VB_Wait_StartTime%,VB_Wait_TotalTime
If>%VB_Wait_TotalTime%<%VB_Wait_var_1%
Goto>VB_Wait_Start
EndIf
END>VB_Wait