Red de conocimiento informático - Problemas con los teléfonos móviles - Problemas relacionados con el temporizador/multiproceso en vb

Problemas relacionados con el temporizador/multiproceso en vb

Creo que tienes varios malentendidos:

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>

Fin

Comienzo VB.Caption = "Prueba de resultado de ejecución del hilo principal:"

Alto = 180

Izquierda = 600

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

'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

'.