| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: process.h
- // Purpose: interface of wxProcess
- // Author: wxWidgets team
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- /**
- @class wxProcess
- The objects of this class are used in conjunction with the ::wxExecute() function.
- When a wxProcess object is passed to ::wxExecute(), its OnTerminate() virtual method
- is called when the process terminates. This allows the program to be (asynchronously)
- notified about the process termination and also retrieve its exit status which is
- unavailable from ::wxExecute() in the case of asynchronous execution.
- @note
- If the @c wxEVT_END_PROCESS event sent after termination is processed by the
- parent, then it is responsible for deleting the wxProcess object which sent it.
- However, if it is not processed, the object will <b>delete itself</b> and so the
- library users should only delete those objects whose notifications have been
- processed (and call wxProcess::Detach for others).
- This also means that unless you're going to process the @c wxEVT_END_PROCESS event,
- you <b>must</b> allocate the wxProcess class on the heap.
- wxProcess also supports IO redirection of the child process. For this, you have
- to call its Redirect() method before passing it to ::wxExecute().
- If the child process was launched successfully, GetInputStream(), GetOutputStream()
- and GetErrorStream() can then be used to retrieve the streams corresponding to the
- child process standard output, input and error output respectively.
- @beginEventEmissionTable{wxProcessEvent}
- @event{EVT_END_PROCESS(id, func)}
- Process a @c wxEVT_END_PROCESS event, sent by wxProcess::OnTerminate upon
- the external process termination.
- @endEventTable
- @library{wxbase}
- @category{appmanagement}
- @beginWxPerlOnly
- In wxPerl this class has an additional @c Destroy method,
- for explicit destruction.
- @endWxPerlOnly
- @see wxExecute(), @ref page_samples_exec
- */
- class wxProcess : public wxEvtHandler
- {
- public:
- /**
- Constructs a process object. @a id is only used in the case you want to
- use wxWidgets events. It identifies this object, or another window that will
- receive the event.
- If the @a parent parameter is different from @NULL, it will receive
- a @c wxEVT_END_PROCESS notification event (you should insert @c EVT_END_PROCESS
- macro in the event table of the parent to handle it) with the given @a id.
- @param parent
- The event handler parent.
- @param id
- id of an event.
- */
- wxProcess(wxEvtHandler* parent = NULL, int id = -1);
- /**
- Creates an object without any associated parent (and hence no id neither)
- but allows to specify the @a flags which can have the value of
- @c wxPROCESS_DEFAULT or @c wxPROCESS_REDIRECT.
- Specifying the former value has no particular effect while using the latter
- one is equivalent to calling Redirect().
- */
- wxProcess(int flags);
- /**
- Destroys the wxProcess object.
- */
- virtual ~wxProcess();
- /**
- Closes the output stream (the one connected to the stdin of the child
- process).
- This function can be used to indicate to the child process that
- there is no more data to be read - usually, a filter program will only
- terminate when the input stream is closed.
- Notice that GetOutputStream() will return @NULL after the output stream
- is closed.
- */
- void CloseOutput();
- /**
- Detaches this event handler from the parent specified in the constructor
- (see wxEvtHandler::Unlink() for a similar but not identical function).
-
- Normally, a wxProcess object is deleted by its parent when it receives the
- notification about the process termination.
-
- However, it might happen that the parent object is destroyed before the external
- process is terminated (e.g. a window from which this external process was launched
- is closed by the user) and in this case it @b should not delete the wxProcess
- object, but @b should call Detach() instead.
-
- After the wxProcess object is detached from its parent, no notification events
- will be sent to the parent and the object will delete itself upon reception of
- the process termination notification.
- */
- void Detach();
- /**
- Returns @true if the given process exists in the system.
- @see Kill(), @ref page_samples_exec "Exec sample"
- */
- static bool Exists(int pid);
- /**
- Returns an input stream which corresponds to the standard error output (stderr)
- of the child process.
- */
- wxInputStream* GetErrorStream() const;
- /**
- It returns an input stream corresponding to the standard output stream of the
- subprocess. If it is @NULL, you have not turned on the redirection.
- @see Redirect().
- */
- wxInputStream* GetInputStream() const;
- /**
- It returns an output stream corresponding to the input stream of the subprocess.
- If it is @NULL, you have not turned on the redirection or already
- called CloseOutput().
- @see Redirect().
- */
- wxOutputStream* GetOutputStream() const;
- /**
- Returns the process ID of the process launched by Open() or set by
- wxExecute() (if you passed this wxProcess as argument).
- */
- long GetPid() const;
- /**
- Returns @true if there is data to be read on the child process standard
- error stream.
- @see IsInputAvailable()
- */
- bool IsErrorAvailable() const;
- /**
- Returns @true if there is data to be read on the child process standard
- output stream.
- This allows to write simple (and extremely inefficient) polling-based code
- waiting for a better mechanism in future wxWidgets versions.
- See the @ref page_samples_exec "exec sample" for an example of using this
- function.
- @see IsInputOpened()
- */
- bool IsInputAvailable() const;
- /**
- Returns @true if the child process standard output stream is opened.
- */
- bool IsInputOpened() const;
- /**
- Send the specified signal to the given process. Possible signal values
- can be one of the ::wxSignal enumeration values.
- @c wxSIGNONE, @c wxSIGKILL and @c wxSIGTERM have the same meaning
- under both Unix and Windows but all the other signals are equivalent to
- @c wxSIGTERM under Windows.
- The @a flags parameter can be @c wxKILL_NOCHILDREN (the default),
- or @c wxKILL_CHILDREN, in which case the child processes of this
- process will be killed too. Note that under Unix, for @c wxKILL_CHILDREN
- to work you should have created the process passing @c wxEXEC_MAKE_GROUP_LEADER.
- Returns the element of ::wxKillError enum.
- @see Exists(), wxKill(), @ref page_samples_exec "Exec sample"
- */
- static wxKillError Kill(int pid, wxSignal sig = wxSIGTERM,
- int flags = wxKILL_NOCHILDREN);
- /**
- It is called when the process with the pid @a pid finishes.
- It raises a wxWidgets event when it isn't overridden.
-
- Note that this function won't be called if you Kill() the process.
- @param pid
- The pid of the process which has just terminated.
- @param status
- The exit code of the process.
- */
- virtual void OnTerminate(int pid, int status);
- /**
- This static method replaces the standard @c popen() function: it launches
- the process specified by the @a cmd parameter and returns the wxProcess
- object which can be used to retrieve the streams connected to the standard
- input, output and error output of the child process.
- If the process couldn't be launched, @NULL is returned.
- @remarks
- In any case the returned pointer should @b not be deleted, rather the process
- object will be destroyed automatically when the child process terminates. This
- does mean that the child process should be told to quit before the main program
- exits to avoid memory leaks.
- @param cmd
- The command to execute, including optional arguments.
- @param flags
- The flags to pass to ::wxExecute().
- Note: @c wxEXEC_SYNC should not be used.
- @return A pointer to new wxProcess object or @NULL on error.
- @see ::wxExecute()
- */
- static wxProcess* Open(const wxString& cmd,
- int flags = wxEXEC_ASYNC);
- /**
- Turns on redirection.
- ::wxExecute() will try to open a couple of pipes to catch the subprocess stdio.
- The caught input stream is returned by GetOutputStream() as a non-seekable stream.
- The caught output stream is returned by GetInputStream() as a non-seekable stream.
- */
- void Redirect();
- /**
- Sets the priority of the process, between 0 (lowest) and 100 (highest).
- It can only be set before the process is created.
- The following symbolic constants can be used in addition to raw
- values in 0..100 range:
- - @b wxPRIORITY_MIN: 0
- - @b wxPRIORITY_DEFAULT: 50
- - @b wxPRIORITY_MAX: 100
- @since 2.9.5
- */
- void SetPriority(unsigned priority);
- };
- /**
- @class wxProcessEvent
- A process event is sent to the wxEvtHandler specified to wxProcess
- when a process is terminated.
- @beginEventTable{wxProcessEvent}
- @event{EVT_END_PROCESS(id, func)}
- Process a @c wxEVT_END_PROCESS event. @a id is the identifier of the process
- object (the id passed to the wxProcess constructor) or a window to receive
- the event.
- @endEventTable
- @library{wxbase}
- @category{events}
- @see wxProcess, @ref overview_events
- */
- class wxProcessEvent : public wxEvent
- {
- public:
- /**
- Constructor.
- Takes a wxProcessObject or window id, a process id and an exit status.
- */
- wxProcessEvent(int id = 0, int pid = 0, int exitcode = 0);
- /**
- Returns the exist status.
- */
- int GetExitCode();
- /**
- Returns the process id.
- */
- int GetPid();
- };
- wxEventType wxEVT_END_PROCESS;
|