Async.3
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:7k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1989-1993 The Regents of the University of California.
  3. '" Copyright (c) 1994-1996 Sun Microsystems, Inc.
  4. '"
  5. '" See the file "license.terms" for information on usage and redistribution
  6. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  7. '" 
  8. '" RCS: @(#) $Id: Async.3,v 1.5.18.1 2004/12/09 09:24:54 dkf Exp $
  9. '" 
  10. .so man.macros
  11. .TH Tcl_AsyncCreate 3 7.0 Tcl "Tcl Library Procedures"
  12. .BS
  13. .SH NAME
  14. Tcl_AsyncCreate, Tcl_AsyncMark, Tcl_AsyncInvoke, Tcl_AsyncDelete, Tcl_AsyncReady - handle asynchronous events
  15. .SH SYNOPSIS
  16. .nf
  17. fB#include <tcl.h>fR
  18. .sp
  19. Tcl_AsyncHandler
  20. fBTcl_AsyncCreatefR(fIproc, clientDatafR)
  21. .sp
  22. fBTcl_AsyncMarkfR(fIasyncfR)
  23. .sp
  24. int
  25. fBTcl_AsyncInvokefR(fIinterp, codefR)
  26. .sp
  27. fBTcl_AsyncDeletefR(fIasyncfR)
  28. .sp
  29. int
  30. fBTcl_AsyncReadyfR()
  31. .SH ARGUMENTS
  32. .AS Tcl_AsyncHandler clientData
  33. .AP Tcl_AsyncProc *proc in
  34. Procedure to invoke to handle an asynchronous event.
  35. .AP ClientData clientData in
  36. One-word value to pass to fIprocfR.
  37. .AP Tcl_AsyncHandler async in
  38. Token for asynchronous event handler.
  39. .AP Tcl_Interp *interp in
  40. Tcl interpreter in which command was being evaluated when handler was
  41. invoked, or NULL if handler was invoked when there was no interpreter
  42. active.
  43. .AP int code in
  44. Completion code from command that just completed in fIinterpfR,
  45. or 0 if fIinterpfR is NULL.
  46. .BE
  47. .SH DESCRIPTION
  48. .PP
  49. These procedures provide a safe mechanism for dealing with
  50. asynchronous events such as signals.
  51. If an event such as a signal occurs while a Tcl script is being
  52. evaluated then it isn't safe to take any substantive action to
  53. process the event.
  54. For example, it isn't safe to evaluate a Tcl script since the
  55. interpreter may already be in the middle of evaluating a script;
  56. it may not even be safe to allocate memory, since a memory
  57. allocation could have been in progress when the event occurred.
  58. The only safe approach is to set a flag indicating that the event
  59. occurred, then handle the event later when the world has returned
  60. to a clean state, such as after the current Tcl command completes.
  61. .PP
  62. fBTcl_AsyncCreatefR, fBTcl_AsyncDeletefR, and fBTcl_AsyncReadyfR
  63. are thread sensitive.  They access and/or set a thread-specific data
  64. structure in the event of a core built with fI--enable-threadsfR.  The token
  65. created by fBTcl_AsyncCreatefR contains the needed thread information it
  66. was called from so that calling fBTcl_AsyncMarkfR(fItokenfR) will only yield
  67. the origin thread into the asynchronous handler.
  68. .PP
  69. fBTcl_AsyncCreatefR creates an asynchronous handler and returns
  70. a token for it.
  71. The asynchronous handler must be created before
  72. any occurrences of the asynchronous event that it is intended
  73. to handle (it is not safe to create a handler at the time of
  74. an event).
  75. When an asynchronous event occurs the code that detects the event
  76. (such as a signal handler) should call fBTcl_AsyncMarkfR with the
  77. token for the handler.
  78. fBTcl_AsyncMarkfR will mark the handler as ready to execute, but it
  79. will not invoke the handler immediately.
  80. Tcl will call the fIprocfR associated with the handler later, when
  81. the world is in a safe state, and fIprocfR can then carry out
  82. the actions associated with the asynchronous event.
  83. fIProcfR should have arguments and result that match the
  84. type fBTcl_AsyncProcfR:
  85. .CS
  86. typedef int Tcl_AsyncProc(
  87.         ClientData fIclientDatafR,
  88.         Tcl_Interp *fIinterpfR,
  89.         int fIcodefR);
  90. .CE
  91. The fIclientDatafR will be the same as the fIclientDatafR
  92. argument passed to fBTcl_AsyncCreatefR when the handler was
  93. created.
  94. If fIprocfR is invoked just after a command has completed
  95. execution in an interpreter, then fIinterpfR will identify
  96. the interpreter in which the command was evaluated and
  97. fIcodefR will be the completion code returned by that
  98. command.
  99. The command's result will be present in the interpreter's result.
  100. When fIprocfR returns, whatever it leaves in the interpreter's result
  101. will be returned as the result of the command and the integer
  102. value returned by fIprocfR will be used as the new completion
  103. code for the command.
  104. .PP
  105. It is also possible for fIprocfR to be invoked when no interpreter
  106. is active.
  107. This can happen, for example, if an asynchronous event occurs while
  108. the application is waiting for interactive input or an X event.
  109. In this case fIinterpfR will be NULL and fIcodefR will be
  110. 0, and the return value from fIprocfR will be ignored.
  111. .PP
  112. The procedure fBTcl_AsyncInvokefR is called to invoke all of the
  113. handlers that are ready.
  114. The procedure fBTcl_AsyncReadyfR will return non-zero whenever any
  115. asynchronous handlers are ready;  it can be checked to avoid calls
  116. to fBTcl_AsyncInvokefR when there are no ready handlers.
  117. Tcl calls fBTcl_AsyncReadyfR after each command is evaluated
  118. and calls fBTcl_AsyncInvokefR if needed.
  119. Applications may also call fBTcl_AsyncInvokefR at interesting
  120. times for that application.
  121. For example, Tcl's event handler calls fBTcl_AsyncReadyfR
  122. after each event and calls fBTcl_AsyncInvokefR if needed.
  123. The fIinterpfR and fIcodefR arguments to fBTcl_AsyncInvokefR
  124. have the same meaning as for fIprocfR:  they identify the active
  125. interpreter, if any, and the completion code from the command
  126. that just completed.
  127. .PP
  128. fBTcl_AsyncDeletefR removes an asynchronous handler so that
  129. its fIprocfR will never be invoked again.
  130. A handler can be deleted even when ready, and it will still
  131. not be invoked.
  132. .PP
  133. If multiple handlers become active at the same time, the
  134. handlers are invoked in the order they were created (oldest
  135. handler first).
  136. The fIcodefR and the interpreter's result for later handlers
  137. reflect the values returned by earlier handlers, so that
  138. the most recently created handler has last say about
  139. the interpreter's result and completion code.
  140. If new handlers become ready while handlers are executing,
  141. fBTcl_AsyncInvokefR will invoke them all;  at each point it
  142. invokes the highest-priority (oldest) ready handler, repeating
  143. this over and over until there are no longer any ready handlers.
  144. .SH WARNING
  145. .PP
  146. It is almost always a bad idea for an asynchronous event
  147. handler to modify the interpreter's result or return a code different
  148. from its fIcodefR argument.
  149. This sort of behavior can disrupt the execution of scripts in
  150. subtle ways and result in bugs that are extremely difficult
  151. to track down.
  152. If an asynchronous event handler needs to evaluate Tcl scripts
  153. then it should first save the interpreter's result plus the values
  154. of the variables fBerrorInfofR and fBerrorCodefR (this can
  155. be done, for example, by storing them in dynamic strings).
  156. When the asynchronous handler is finished it should restore
  157. the interpreter's result, fBerrorInfofR, and fBerrorCodefR,
  158. and return the fIcodefR argument.
  159. .SH KEYWORDS
  160. asynchronous event, handler, signal