Manual de programación de OS/2/Llamadas DOSxxx para multitarea
DosCreateThread
editarDosCreateThread crea un nuevo Thread asíncrono. El código especificado empieza su ejecución de forma paralela al código que ejecutó la instrucción. En el caso del EMX, debe usarse la función _beginthread(), a menos que el código no haga llamadas a funciones estandar de C. Ver la documentación del compilador.
'#define INCL_BASE
'#include <os2.h>
PTID ptidThreadID;
PFNTHREAD pThreadAddr;
ULONG ulThreadArg;
ULONG ulThreadFlags;
ULONG ulStackSize;
APIRET rc; /* Codigo de error */
rc = DosCreateThread(ptidThreadID, pThreadAddr, ulThreadArg, ulThreadFlags, ulStackSize);
Parámetros
editarptidThreadID | Un puntero donde OS/2 devuelve el identificador del thread creado. |
pThreadAddr | Un puntero a la rutina a ser ejecutada por el nuevo thread. Esta función admite un parámetro ThreadArg y retorna una doble palabra al terminar. El retorno desde la función con DosExit hace que el thread finalice. |
ulThreadArg | Un argumento que es pasado a la rutina del thread como un parámetro. Normalmente es un puntero a un bloque de parámetros. |
ulThreadFlags | Si el bit 0 está puesto a cero, el nuevo thread comienza inmediatamente. Si está puesto a uno, queda dormido, y el creador del thread tiene que usar DosResumeThread para que empiece la ejecución. El resto de bits debe estar a cero. |
ulStackSize | La longitud, en bytes, de la pila del nuevo thread. El tamaño es redondeado a un número completo de páginas, o bien a 2 páginas si el tamaño es menor. |
Codigos de error
editar0 Sin error
8 No hay suficiente memoria
95 Interrupción
115 Violación de protección
164 No se pueden crear más threads
DosEnterCritSec
editarDosEnterCritSec duerme todos los threads pertenecientes al proceso actual excepto el que realiza la llamada. Puede ser útil para casos en los que se quiera sincronizar accesos muy esporádicos, sin tener que usar semáforos.
'#define INCL_BASE
'#include <os2.h>
APIRET rc; /* Codigo de error */
rc = DosEnterCritSec();
Codigos de error
editar0 Sin error
309 Identificador de Thread no válido
484 Desbordamiento de CritSec
DosExecPgm
editarDosExecPgm permite a un programa ejecutar a otro como un proceso hijo.
'#define INCL_BASE
'#include <os2.h>
PCHAR pObjNameBuf;
LONG lObjNameBufL;
ULONG ulExecFlags;
PSZ pszArgPointer;
PSZ pszEnvPointer;
PRESULTCODES pReturnCodes;
PSZ pszPgmPointer;
APIRET rc; /* Codigo de error */
rc = DosExecPgm(pObjNameBuf, lObjNameBufL, ulExecFlags, pszArgPointer, pszEnvPointer, pReturnCodes, pszPgmPointer);
Parámetros
editarpObjNameBuf | Puntero a un buffer donde OS/2 devuelve el nombre del objeto que ha contribuido al fallo de DosExecPgm. | ||||||||||||||||
lObjNameBufL | Longitud en bytes del buffer ObjNameBuf | ||||||||||||||||
ulExecFlags | Indica como se debe ejecutar el programa, según los valores siguientes:
| ||||||||||||||||
pszArgPointer | Puntero de las cadenas pasadas al programa. Representan los parametros del programa, que son copiados al segmento de entorno del nuevo proceso. La convención usada por CMD.EXE es que el primer string es el nombre del programa, y el segundo son los parametros. Un valor de cero indica que no hay parámetros para el programa. | ||||||||||||||||
pszEnvPointer | Puntero a las variables de entorno pasadas al programa. Estos strings representan variables de entorno y sus valores actuales. | ||||||||||||||||
pReturnCodes | Puntero a una estructura de dos dobles palabras donde el PID o el código de terminación es almacenado. Tiene dos zonas, a saber:
| ||||||||||||||||
pszPgmPointer | Puntero al nombre del fichero que contiene el programa a ser ejecutado. |
Codigos de error
editar0 Sin error
1 Función no válida
2 Fichero no encontrado
3 Path no encontrado
4 Demasiados archivos abiertos
5 Acceso denegado
8 No hay suficiente memoria
10 Entorno no válido
11 Formato no válido
13 Datos no válidos
26 Disco sin sistema de ficheros
32 Violación de compartición
33 Violación del bloqueo
36 Desbordamiento del buffer de compartición
89 Sin slots de procs
95 Interrupción
108 Unidad bloqueada
127 Proc no encontrado
182 Ordinal no válido
190 Tipo de módulo no válido
191 Signatura de EXE no válida
192 Marca de EXE no válida
195 MINALLOCSIZE no válido
196 Enlace dinámico pedido desde un anillo no válido
DosExit
editarDosExit suele ser llamada cuando un thread termina.
'#define INCL_BASE
'#include <os2.h>
ULONG ulActionCode;
ULONG ulResultCode;
DosExit(ulActionCode, ulResultCode);
Parámetros
editarulActionCode | Determina si se termina solo el thread actual, o todos los threads del proceso. Los valores posibles son:
0: (EXIT_THREAD) el thread actual termina. 1: (EXIT_PROCESS) todos los threads del proceso terminan. |
ulResutlCode | Un valor que es pasado a cualquier thread que halla ejecutado un DosWaitChild para este proceso. |
DosExitCritSec
editarDosExitCritSec restaura el funcionamiento normal de todos los threads de un proceso, después de la ejecución de un DosEnterCritSec.
'#define INCL_BASE
'#include <os2.h>
APIRET rc; /* Codigo de error */
rc = DosExitCritSec();
Codigos de error
editar0 Sin error
309 Identificador de Thread no válido
485 Underflow de CritSec (se ha intentado ejecutar más Exits que Enters).
DosKillProcess
editarDosKillProcess marca un proceso para ser finalizado, y devuelva el código de terminación a su padre (si lo tiene).
'#define INCL_BASE
'#include <os2.h>
ULONG ulActionCode;
PID idProcessID;
APIRET rc; /* Codigo de error */
rc = DosKillProcess(ulActionCode, idProcessID);
Parámetros
editarulActionCode | Los procesos que deben ser marcados para ser finalizados. El valor puede ser uno de los siguientes:
| ||||||
idProcessID | El PID del proceso a ser marcado. |
Codigos de error
editar0 Sin error
13 Datos no válidos
217 Procesos Zombie
303 PID no válido
305 No hay descendientes
DosKillThread
editarDosKillThread mata un thread del proceso actual. Si se mata al thread 1, todo el proceso muere. Si el thread a matar tiene código de 16 bits o ha sido creado por una llamada de 16 bits, se devuelve el error Ocupado.
'#define INCL_BASE
'#include <os2.h>
TID idThreadID;
APIRET rc; /* Codigo de error */
rc = DosKillThread(idThreadID);
Parámetros
editaridThreadID Identificador del thread a matar.
Codigos de error
editar0 Sin error 170 Ocupado 309 Identificador de Thread no válido
DosResumeThread
editarDosResumeThread arranca un thread que fue parado previamente con DosSuspendThread.
'#define INCL_BASE
'#include <os2.h>
TID idThreadID;
APIRET rc; /* Codigo de error */
rc = DosResumeThread(idThreadID);
Parámetros
editarPID del thread
Codigos de error
editar0 Sin error 90 El thread no estaba parado 309 Identificador de Thread no válido
DosSetPriority
editarDosSetPriority cambia la prioridad del thread o de un proceso hijo.
'#define INCL_BASE
'#include <os2.h>
ULONG ulScope;
ULONG ulPriorityClass;
LONG lPriorityDelta;
ULONG ulID;
APIRET rc; /* Codigo de error */
rc = DosSetPriority(ulScope, ulPriorityClass, lPriorityDelta, ulID);
Parámetros
editarulScope | A quien afecta el cambio de prioridad
| ||||||||||||
ulPriorityClass | Tipo de prioridad. El valor puede ser:
| ||||||||||||
ulID | Un identificador de proceso (Scope = 0 o 1) o un identificador de thread (Scope = 2). Si este operando es igual a cero, se asume el proceso o thread actual. |
Codigos de error
editar0 Sin error
303 PID no válido
304 PDELTA no válido
305 No hay descendientes
307 PCLASS no válido
308 SCOPE no válido
309 Identificador de Thread no válido
DosSuspendThread
editarDosSuspendThread suspende temporalmente la ejecución de otro thread del proceso actual, hasta que se ejecuta un DosResumeThread.
'#define INCL_BASE
'#include <os2.h>
TID idThreadID;
APIRET rc; /* Codigo de error */
rc = DosSuspendThread(idThreadID);
Parámetros
editaridThreadID PID del thread que debe ser suspendido.
Codigos de error
editar0 Sin error
309 Identificador de Thread no válido
DosWaitThread
editarDosWaitThread suspende el thread actual hasta que otro thread termine. Devuelve el PID del thread que ha terminado.
"#define INCL_BASE
"#include <os2.h>
PTID ptidThreadID;
ULONG ulWaitOption;
APIRET rc; /* Codigo de error */
rc = DosWaitThread(ptidThreadID, ulWaitOption);
Parámetros
editarptidThreadID | Antes de llamar la función, debe contener un puntero al ThreadID del thread que interese. Si es cero, el thread actual espera hasta que un thread cualquiera del proceso actual termine. Si no es cero, espera hasta que ese thread concreto acabe.
Al volver, apunta al ThreadID (TID) del thread que ha terminado (util cuando se ha especificado cero en la entrada). | ||||||
ulWaitOption | Indica cuando debe retornar:
|
Codigos de error
editar0 Sin error
95 Interrupción
294 Thread no terminado
309 Identificador de Thread no válido