Me gustaria muchuchusisimo saber si se puede "pausar" o detener temporalmente la ejecucion de un programa y cual es la Api q lo hace. Para q no se malentienda, quiero pausar desde mi programa en vb, otro programa externo.
gracias de antemano.
Algo tipo Olly o Softice? :o :o
Lo veo dificil.
Saludos,
Ertai
No se pueden pausar aplicaciones sino threads. Para pausar una aplicación tenés que pausar su thread primario.
Para detener la ejecución de un subproceso (thread) se utiliza la función SuspendThread (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/suspendthread.asp). Para volver a reanudar la ejecución se utiliza ResumeThread (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/resumethread.asp). Se puede llamar a la función SuspendThread las veces que se deseen pero luego hay que llamar a ResumeThread la misma cantidad de veces para que el subproceso continúe ejecutandose.
Saludos.
¿como puedo saber el handle del thread primario? porque segun vi, a la funcion suspendthread hay que pasarle como parametro el handle, pero yo solamente sé el ID del thread, y no me funca.
Sé que una manera seria abriendo el ID con la funcion OpenThread, pero esa funcion solo existe en WinXP.
¿Alguna Idea?
thx.
depura el proceso desde tu programa (debugactiveprocess), cuando DebugEventCode sea = a CREATE_PROCESS_DEBUG_EVENT tiras de CREATE_PROCESS_DEBUG_INFO que consta de estos datos:
typedef struct _CREATE_PROCESS_DEBUG_INFO { // cpdi
HANDLE hFile;
HANDLE hProcess;
HANDLE hThread; <--------------- aqui lo que buscas
LPVOID lpBaseOfImage;
DWORD dwDebugInfoFileOffset;
DWORD nDebugInfoSize;
LPVOID lpThreadLocalBase;
LPTHREAD_START_ROUTINE lpStartAddress;
LPVOID lpImageName;
WORD fUnicode;
} CREATE_PROCESS_DEBUG_INFO;
Declare Function MsgWaitForMultipleObjects Lib "user32" _
(ByVal nCount As Long, pHandles As Long, ByVal fWaitAll As Long, _
ByVal dwMilliseconds As Long, ByVal dwWakeMask As Long) As Long
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, _
ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Sub Main()
Static t As Boolean
If t <> True Then _
SetTimer hwnd, 0, 1, AddressOf TimerProc: t = True
SafeSleep (3600)
End Sub
Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
' EJECUCION EN SEGUNDO PLANO
'///////////////////////////////////////////////////////
' [ CODE code ]:::::::::::::>>
'///////////////////////////////////////////////////////
End Sub
Sub SafeSleep(ByVal inWaitSeconds As Single) 'PAUSA Y NO CARGA LA CPU!!!
Const WAIT_OBJECT_0 As Long = 0
Const WAIT_TIMEOUT As Long = &H102
Dim lastTick As Single
Dim timeout As Long
timeout = inWaitSeconds * 1000
lastTick = Timer
Do
Select Case MsgWaitForMultipleObjects(0, 0, False, timeout, 255)
Case WAIT_OBJECT_0
DoEvents
timeout = ((inWaitSeconds) - (Timer - lastTick)) * 1000
If timeout < 0 Then timeout = 0
Case Else
Exit Do
End Select
Loop While True
Main ' VUELVE AL PROCEDIMIENTO PRINCIPAL
End Sub
en ese codigo pausa otro proceso por algun sitio?
Main ' VUELVE AL PROCEDIMIENTO PRINCIPAL
Esa linea va a provocar un desbordamiento de pila.
Saludos.
ummmmm muy interesante el hilo :o
1) El code no anda.
2) Que se supone que hace? Un Sleep a mi propio proceso?
3) Crashoverwrite, eso es lo q hace el code, crashea. jaja.
salu!
Precisamente lo que evito es el desbordamiento de pila. de todas maneras, lo tengo en desarrollo..
Pruebenlo y me dicen despues,;compilen en un nuevo proyecto exe, en un modulo estandar solamente, sin form. y dejenlo corriendo todo el tiempo que quieran, luego me dicen que tal muchachos!
NOTA DEL MODERADOR: No uses mayúsculas, en el foro se considera que estás gritando.
Insisto que ese código va a dar un desbordamiento de pila y no sirve para detener ningún otro proceso, revisalo bien.
Saludos.
PUES A MI NO ME LO DA!!
Primero, no escribas en mayúsculas.
Ahora vamos a ver. El programa empieza en Main. Desde Main se llama a SafeSleep, desde SafeSleep vuelve a llamar a Mains y asçi sucesivamente. ¿Qué crees que va a pasar luego de varias llamadas a Main?, claro que si, un stack overflow.
Probá el siguiente código:
Sub Main
Call SafeSleep
End Sub
Sub SafeSleep()
Call Main
End Sub
Es lo mismo pero sin las demás instrucciones. Si lo probás te da un stack overflow.
Esto es simple, si no sabes, no comentas y listo. Veo que ni siquiera con un código tan simple podés comprender tu error así que no vengas a querer ganar, esto no es una competencia. Si fueras más humilde aceptarías que te esquivocaste y ya.
Ahora como programador te digo que el código que pusiste es realmente horrible y mal estructurado, eso mismo se puede hacer de otra forma mucho menos complicada y SIN ERRORES DE PROGRAMACIÓN. Además no tiene nada que ver con este hilo.
Tema cerrado, si no te gusta te vas y ya, y no faltes el respeto porque en ningún momento te traté mal ni mucho menos.