Re: [fpc-pascal] CrossPlatform problem, INFINITE not defined on Linux

2020-07-19 Thread Marco van de Voort


Op 7/19/2020 om 5:40 PM schreef Bo Berglund via fpc-pascal:

On Sun, 19 Jul 2020 08:46:14 +0200 (CEST), Michael Van Canneyt
 wrote:


Various RunCommand procedures in process unit:
https://www.freepascal.org/docs-html/current/fcl/process/runcommand.html


But it looks like it hangs around until the started process exits...
How can I set a timeout on the execution (don't want the whole system
to hang if this external program does not exit)?


Runcommand handles the most used scenarios only. But in FPC 3.2.0 there 
have been some changes to make own variants easier.


I happened to make a variant with a timeout last week, and use this as a 
demonstration for that (3.2.0+) functionality :


https://forum.lazarus.freepascal.org/index.php/topic,50525.msg368880.html#msg368880

but that is as of yet still untested on non-windows. (but it is general 
in principle)




I'll answer these because they are not documented yet:

poRunIdle -  mainly for tprocess.runcommandloop:  run a sleep() in the 
main loop that polls the pipes.


  In general, enable it for runcommands that run 
longer (to reduce CPU use), disable it if you expect that the process 
runs very short (e.g. "hostname"  on linux)


poDetached - The Windows implementation of poNoconsole of FPC 3.0.4 and 
older.   FPC 3.2.0+ ponoconsole is instantiates less of the console, but 
this causes problems for a few programs (like mysql console). In those 
cases use podetached instead ponoconsole


___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] CrossPlatform problem, INFINITE not defined on Linux

2020-07-19 Thread Michael Van Canneyt



On Sun, 19 Jul 2020, Bo Berglund via fpc-pascal wrote:


On Sun, 19 Jul 2020 17:51:59 +0200 (CEST), Michael Van Canneyt
 wrote:




On Sun, 19 Jul 2020, Bo Berglund via fpc-pascal wrote:


On Sun, 19 Jul 2020 08:46:14 +0200 (CEST), Michael Van Canneyt
 wrote:


Various RunCommand procedures in process unit:
https://www.freepascal.org/docs-html/current/fcl/process/runcommand.html



But it looks like it hangs around until the started process exits...
How can I set a timeout on the execution (don't want the whole system
to hang if this external program does not exit)?

And if I just want to start a process but not wait for it to exit?


Use TProcess.

https://www.freepascal.org/docs-html/current/fcl/process/tprocess.html

do NOT specify poWaitOnExit in the options, and simply call Execute. 
It will return at once.


To clarify:
If I do not specify [poWaitOnExit] to Execute, then it will return
immediately with the process running and I can check whenever I like
if it is still running using the Running() method.
This seems like I can do what I need.

Question:
-
If I free the TProcess object will that terminate the running process
or just detatch from it?


It detaches.


Michael.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] CrossPlatform problem, INFINITE not defined on Linux

2020-07-19 Thread Bo Berglund via fpc-pascal
On Sun, 19 Jul 2020 17:51:59 +0200 (CEST), Michael Van Canneyt
 wrote:

>
>
>On Sun, 19 Jul 2020, Bo Berglund via fpc-pascal wrote:
>
>> On Sun, 19 Jul 2020 08:46:14 +0200 (CEST), Michael Van Canneyt
>>  wrote:
>>
>>> Various RunCommand procedures in process unit:
>>> https://www.freepascal.org/docs-html/current/fcl/process/runcommand.html
>>>
>>
>> But it looks like it hangs around until the started process exits...
>> How can I set a timeout on the execution (don't want the whole system
>> to hang if this external program does not exit)?
>>
>> And if I just want to start a process but not wait for it to exit?
>
>Use TProcess.
>
>https://www.freepascal.org/docs-html/current/fcl/process/tprocess.html
>
>do NOT specify poWaitOnExit in the options, and simply call Execute. 
>It will return at once.

To clarify:
If I do not specify [poWaitOnExit] to Execute, then it will return
immediately with the process running and I can check whenever I like
if it is still running using the Running() method.
This seems like I can do what I need.

Question:
-
If I free the TProcess object will that terminate the running process
or just detatch from it?
The description for TProcess.Destroy seems to indicate this.

The reason I ask this much is that the use case here is a remotely
running monitoring system taking regular measurements and as an option
after each measurement an analysis program may be started to evaluate
if an alarm should be sent out.
Since the system will be unattended I have to make sure it won't hang
anywhere...


-- 
Bo Berglund
Developer in Sweden

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] CrossPlatform problem, INFINITE not defined on Linux

2020-07-19 Thread Michael Van Canneyt



On Sun, 19 Jul 2020, Bo Berglund via fpc-pascal wrote:


On Sun, 19 Jul 2020 08:46:14 +0200 (CEST), Michael Van Canneyt
 wrote:


Various RunCommand procedures in process unit:
https://www.freepascal.org/docs-html/current/fcl/process/runcommand.html



But it looks like it hangs around until the started process exits...
How can I set a timeout on the execution (don't want the whole system
to hang if this external program does not exit)?

And if I just want to start a process but not wait for it to exit?


Use TProcess.

https://www.freepascal.org/docs-html/current/fcl/process/tprocess.html

do NOT specify poWaitOnExit in the options, and simply call Execute. 
It will return at once.


Michael.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] CrossPlatform problem, INFINITE not defined on Linux

2020-07-19 Thread Bo Berglund via fpc-pascal
On Sun, 19 Jul 2020 08:46:14 +0200 (CEST), Michael Van Canneyt
 wrote:

>Various RunCommand procedures in process unit:
>https://www.freepascal.org/docs-html/current/fcl/process/runcommand.html
>

But it looks like it hangs around until the started process exits...
How can I set a timeout on the execution (don't want the whole system
to hang if this external program does not exit)?

And if I just want to start a process but not wait for it to exit?
Say a s/w updater that requires the application to exit before it can
do its thing?

I looked at the options that can be applied to the call and these are
somewhat non-obvious:

poWaitOnExit  (if I don't use this will the call return at once?)
poDetached(what does this do?)
poRunIdle (what does this do?)


-- 
Bo Berglund
Developer in Sweden

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] CrossPlatform problem, INFINITE not defined on Linux

2020-07-19 Thread Bo Berglund via fpc-pascal
On Sun, 19 Jul 2020 10:55:56 +0200 (CEST), Michael Van Canneyt
 wrote:

>> These are used exactly 1 time each in the full application...
>
>All the more reason to dispense with the unit.
>Less code to maintain.
>

Seems like RunCommandInDir or simply RunCommand can do what the
ExecWait with all its setting up of process flags and whatnot does.
So as you say I could as well discard the unit altogether and put this
call in the main code instead.

Thanks for pointing it out. Original code is from about 2008...

In fact a few years back I created a video handler using ffmpeg as the
processing program and when looking back there I see now I used
RunCommandInDir. And it is also Windows/Linux.
This was a project built entirely with Lazarus/Fpc of course.


-- 
Bo Berglund
Developer in Sweden

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] CrossPlatform problem, INFINITE not defined on Linux

2020-07-19 Thread Michael Van Canneyt



On Sun, 19 Jul 2020, Bo Berglund via fpc-pascal wrote:



or use TProcess.
https://www.freepascal.org/docs-html/current/fcl/process/tprocess.html



OK, thanks.
Then I will have to make a rewrite of the unit...

Possibly add IFDEF:s such that the Windows version remains and I
create equivalents for Linux using for example TProcess.

Thankfully there are only these two functions to deal with:
ExecAndWait() starts a program and waits for it to complete
ExecStart() starts a program and leaves it running

These are used exactly 1 time each in the full application...


All the more reason to dispense with the unit.
Less code to maintain.

Michael.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] CrossPlatform problem, INFINITE not defined on Linux

2020-07-19 Thread Bo Berglund via fpc-pascal
On Sun, 19 Jul 2020 08:46:14 +0200 (CEST), Michael Van Canneyt
 wrote:

>
>
>On Sun, 19 Jul 2020, Bo Berglund via fpc-pascal wrote:
>
>> I am porting an old application from Delphi to Lazarus and Windows to
>> Linux.
>> This application has a unit ExecWait, which was created to simplify
>> running tool programs from the main program, so it supplies two
>> procedures as:
>>
>> function ExecAndWait(Cmdline: string; Hide: boolean = false; MaxWait:
>> DWORD = INFINITE; Prio: TExecPrio = normal): DWORD;
>> function ExecStart(Cmdline: string; InheritHandle: boolean = true;
>> Prio: TExecPrio = normal): DWORD;
>>
>> I have had no problems with this unit when moving from Delphi to FPC,
>> it compiles just fine on Windows.
>>
>> But when I move the code to Linux (via Subversion) it throws an error
>> on "Run/Quick Compile":
>>
>> ExecWait.pas(15,79) Error: Identifier not found "INFINITE"
>>
>> The line that gets the error is the declaration for ExecAndWait above.
>>
>> On Windows I could check where it is defined and I found it in:
>> C:\Programs\Lazarus_2.0.8\fpc\3.0.4\source\rtl\win\wininc\defines.inc
>>
>> How do I bring in the corresponding Linux version of this?
>
>You can't. INFINITE is specific to Windows.
>
>You must get rid of the ExecAndWait. This is just the first error you will
>run into, many more will follow.
>
>The corresponding functions exist in FPC :
>
>ExecuteProcess in SysUtils unit:
>https://www.freepascal.org/docs-html/current/rtl/sysutils/executeprocess.html
>
>Various RunCommand procedures in process unit:
>https://www.freepascal.org/docs-html/current/fcl/process/runcommand.html
>
>or use TProcess.
>https://www.freepascal.org/docs-html/current/fcl/process/tprocess.html
>

OK, thanks.
Then I will have to make a rewrite of the unit...

Possibly add IFDEF:s such that the Windows version remains and I
create equivalents for Linux using for example TProcess.

Thankfully there are only these two functions to deal with:
ExecAndWait() starts a program and waits for it to complete
ExecStart() starts a program and leaves it running

These are used exactly 1 time each in the full application...


-- 
Bo Berglund
Developer in Sweden

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] CrossPlatform problem, INFINITE not defined on Linux

2020-07-19 Thread Michael Van Canneyt



On Sun, 19 Jul 2020, Bo Berglund via fpc-pascal wrote:


I am porting an old application from Delphi to Lazarus and Windows to
Linux.
This application has a unit ExecWait, which was created to simplify
running tool programs from the main program, so it supplies two
procedures as:

function ExecAndWait(Cmdline: string; Hide: boolean = false; MaxWait:
DWORD = INFINITE; Prio: TExecPrio = normal): DWORD;
function ExecStart(Cmdline: string; InheritHandle: boolean = true;
Prio: TExecPrio = normal): DWORD;

I have had no problems with this unit when moving from Delphi to FPC,
it compiles just fine on Windows.

But when I move the code to Linux (via Subversion) it throws an error
on "Run/Quick Compile":

ExecWait.pas(15,79) Error: Identifier not found "INFINITE"

The line that gets the error is the declaration for ExecAndWait above.

On Windows I could check where it is defined and I found it in:
C:\Programs\Lazarus_2.0.8\fpc\3.0.4\source\rtl\win\wininc\defines.inc

How do I bring in the corresponding Linux version of this?


You can't. INFINITE is specific to Windows.

You must get rid of the ExecAndWait. This is just the first error you will
run into, many more will follow.

The corresponding functions exist in FPC :

ExecuteProcess in SysUtils unit:
https://www.freepascal.org/docs-html/current/rtl/sysutils/executeprocess.html

Various RunCommand procedures in process unit:
https://www.freepascal.org/docs-html/current/fcl/process/runcommand.html

or use TProcess.
https://www.freepascal.org/docs-html/current/fcl/process/tprocess.html

Michael.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


[fpc-pascal] CrossPlatform problem, INFINITE not defined on Linux

2020-07-19 Thread Bo Berglund via fpc-pascal
I am porting an old application from Delphi to Lazarus and Windows to
Linux.
This application has a unit ExecWait, which was created to simplify
running tool programs from the main program, so it supplies two
procedures as:

function ExecAndWait(Cmdline: string; Hide: boolean = false; MaxWait:
DWORD = INFINITE; Prio: TExecPrio = normal): DWORD;
function ExecStart(Cmdline: string; InheritHandle: boolean = true;
Prio: TExecPrio = normal): DWORD;

I have had no problems with this unit when moving from Delphi to FPC,
it compiles just fine on Windows.

But when I move the code to Linux (via Subversion) it throws an error
on "Run/Quick Compile":

ExecWait.pas(15,79) Error: Identifier not found "INFINITE"

The line that gets the error is the declaration for ExecAndWait above.

On Windows I could check where it is defined and I found it in:
C:\Programs\Lazarus_2.0.8\fpc\3.0.4\source\rtl\win\wininc\defines.inc

How do I bring in the corresponding Linux version of this?
Is there some specific uses clause to set?

Right now I have this:

uses
  {$IFDEF UNIX}
unix;
  {$ELSE}
windows;
  {$ENDIF}

As it compiles in Windows it must be something I have to do when
porting to Linux


-- 
Bo Berglund
Developer in Sweden

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal