Problemas relacionados con el temporizador/multiproceso en vb
1; El programa no se ejecutará más rápido porque consume más recursos del sistema. Los programas deben realizar la misma función, y cuanto menos trabajo tenga que hacer su código en la CPU y menos recursos del sistema utilice, más eficiente será su código y más rápido se ejecutará su programa. Además, cuantos menos subprocesos esté ejecutando actualmente la CPU, más recursos tendrá disponibles para atender los programas que necesita, por lo que sus programas se ejecutarán más rápido.
2: ¿Cuánto código se puede ejecutar en 1 milisegundo? Esto no es del todo correcto. La CPU ejecuta instrucciones de máquina compiladas en código. Existe una relación entre lo que llamamos frecuencia de la CPU y velocidad de la CPU. Una CPU que funciona a 100 MHz tarda solo 10 ns en ejecutar una instrucción. La prioridad del subproceso también tiene un impacto en la velocidad, pero no de manera significativa.
3: Con respecto a la implementación de subprocesos múltiples de VB, daré un buen ejemplo en línea.
TextBox Texto1
Alto = 270
Izquierda = 960
TabIndex = 2
Texto = "2"
Arriba = 2760
Ancho = 2415
Fin
Inicio VB.CommandButton Command2
Título = "Regresar"
Alto = 255
Izquierda = 3480
TabIndex = 1
Superior = 2760
Ancho = 1455
Fin
Comienzo VB.> Izquierda = 3480
TabIndex = 0
Arriba = 240
Ancho = 1455 p> p>
Fin
Comienzo VB.Caption = "Prueba de resultado de ejecución del hilo principal:"
Alto = 180
Izquierda = 600 p>
TabIndex = 3
Superior = 2400
Ancho = 1710
Fin
Fin
. Atributo VB_Name = "Form1"
Atributo VB_GlobalNameSpace = False
Atributo VB_Creatable = False
Atributo VB_PredeclaredId = True
Atributo VB_Exposed = False
Private Sub Command1_Click()
'Declara el ID del hilo
Atenuar threadid1 mientras
Atenuar threadid2 mientras p>
'Parámetro uno, parámetro dos, dwStackSize, el tamaño de la pila de subprocesos, que puede ser 0, lo que indica que la pila es la misma que la pila de esta aplicación
'Parámetro 3, lpstartAddress, la dirección de la función de ejecución, use AddressOf get
'Parámetro 4, lpParameter, la dirección del parámetro de la función de ejecución, que puede ser un registro u otro tipo. Use VarPtr para obtener la dirección del parámetro (. funciones no reveladas usan varptr)!
'El parámetro cinco, dwCreationFlags, representa el estado del hilo después de su creación.
'Parámetro seis, lpThreadID representa el número de hilo asignado al hilo
Llamar a CreateThread(Null, ByVal Oamp;, AddressOf Module1.
Llamar a CreateThread(Null , ByVal 0amp;, AddressOf Module1.OutText2, VarPtr(0), ByVal 0amp;, threadid1)
End Sub
Private Sub Command2_Click()
>
'¡Este evento se ejecuta en el hilo principal!
Dim i As Long
i = CLng(Text1.Text)
Text1.Text = CStr(i * i) 'No hagas clic en demasiados veces, el tipo LONG se desbordará
End Sub
Private Sub Form_Load()
'Guarde la variable global del identificador del formulario para dibujar en el formulario
formhandle = Form1.hwnd
End Sub
-------------------------- ------
'Guarde esta parte de los datos en el archivo Module1.bas
Atributo VB_Name = "Module1"
'Seguridad subproceso Estructura de datos de atributos (estructura de datos de atributos segura para subprocesos);
Tipo público SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
'Esta es la estructura de datos utilizada para múltiples Esta es la estructura de datos utilizada para el acceso multiproceso a la API de sincronización de recursos críticos
Tipo público CRITICAL_ SECTION
ficticio Siempre
Tipo final
'¿Por qué utilizar la función GDI para dibujar? El motivo se explicará más adelante
Función de declaración pública GetDC Lib "user32" (ByVal hwnd siempre y cuando)
Función de declaración pública SetBkColor Lib "gdi32" (ByVal hdc mientras, ByVal crColor mientras)
Función de declaración pública TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
Función de declaración pública ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
'Tenga en cuenta
Función de declaración pública CreateThread Lib "kernel32" ( lpThreadAttributes como cualquiera, ByVal dw
StackSize Mientras, ByVal lpStartAddress Mientras, ByVal lpParameter Mientras, ByVal dwCreationFlags Mientras),
Declaración pública Sub Sleep Lib "kernel32" (ByVal dwMillisegundos Mientras)
Declaración pública Sub EnterCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION) 'Ingrese a la sección crítica
Declaración pública Sub LeaveCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION) 'Salga de la sección crítica. SECTION) 'Salir de la sección crítica
'Algunos ejemplos de funciones importantes
'ObjPtr: Devuelve la dirección del campo privado de la instancia del objeto.
'StrPtr: Devuelve la dirección de la primera palabra de la cadena.
'VarPtr: Devuelve la dirección de la variable.
'¡Identificador global del formulario!
Manejo de formulario público As Long
'Estructura de datos críticos (estructura de datos clave)
Secta pública As CRITICAL_SECTION
Sub OutText1() ' Procedimiento uno (proceso uno)
Dim i As Long
Dimdc As Long
Dim s As String
dc = GetDC(formhandle ) 'Obtiene el DC del identificador de formulario
Para i = 1 a 100000
s = CStr(i)
Llama a SetBkColor(dc, amp; HF0F0F0 ) ' Establece el color de fondo del área de dibujo y bórralo al mismo tiempo
Call TextOut(dc, 10, 10, s, Len(s)) '¡Texto de salida!
Llamar a Sleep(40) 'Esperando
Siguiente
Llamar a ReleaseDC(formhandle, dc) '¡Liberar recursos!
'Llamar a EnterCriticalSection(sect)
' Las direcciones superior e inferior indican que esta es la parte crítica. Si desea operar las variables globales del proyecto, es mejor. operar en esta área
' De lo contrario , el programa puede fallar fácilmente durante la sincronización de subprocesos
'Llamar a LeaveCriticalSection(sect) '¡Espera! LeaveCriticalSection(sect)
End Sub
Sub OutText2() 'Similar al proceso 1
Atenuar i mientras
Atenuar dc como Largo
Dim s como cadena
dc = GetDC(formhandle)
Para i = 1 a 100000
s = CStr(i )
Llamar a SetBkColor(dc, amp; HF0F0F0)
Llamar a TextOut(dc, 10, 80, s, Len(s)) 'La posición del texto ha cambiado
Call Sleep(20) ' Retraso cambiado
Siguiente
Call ReleaseDC(formhandle, dc)
' Call EnterCriticalSection(sect)
'Llamar a LeaveCriticalSection(sect)
End Sub
'Es importante saber por qué se utiliza la función gdi para generar texto;
'Programar Utilice la función TextOut, difícil de usar, para realizar un seguimiento de los números en lugar de utilizar un control de etiqueta porque no todos los componentes de VB son seguros para subprocesos.
'No todos los componentes de VB son seguros para subprocesos. Cuando varios subprocesos acceden a un componente que no es seguro para subprocesos, se producirá un error grave
'.