vb如何同时读取多个进程名相同的进程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb如何同时读取多个进程名相同的进程相关的知识,希望对你有一定的参考价值。

RT,同时读取进程名相同和窗口语柄相同的进程。就是如何同时读取一个游戏的多开,知道的请告诉我,谢谢

VB 通用枚举进程模块

Option Explicit

'************************************* 用于枚举进程*********************************
'CreateToolhelpSnapshot为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程[THREAD])建立一个快照[snapshot]。

'参数:
'dwFlags

'TH32CS_INHERIT -声明快照句柄是可继承的
'TH32CS_SNAPall -在快照中包含系统中所有的进程和线程
'TH32CS_SNAPheaplist -在快照中包含在th32ProcessID中指定的进程的所有的堆
'TH32CS_SNAPmodule -在快照中包含在th32ProcessID中指定的进程的所有的模块
'TH32CS_SNAPPROCESS -在快照中包含系统中所有的进程
'TH32CS_SNAPthread -在快照中包含系统中所有的线程

'th32ProcessID

'[输入]指定将要快照的进程ID。如果该参数为0表示快照当前进程。
'该参数只有在设置了TH32CS_SNAPHEAPLIST或TH32CS_SNAPMOUDLE后才有效,在其他情况下该参数被忽略,所有的进程都会被快照。
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long

'获得系统快照中的第一个进程的信息
Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long

'获得系统快照中的下一个进程的信息
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long

'参数: Handle hSnapshot传入的Snapshot句柄
'参数:LPMODULEENTRY3 lpme 指向一个 MODULEENTRY32结构的指针
'作用:从Snapshot得到第一个进程记录信息
Private Declare Function Module32First Lib "kernel32" (ByVal hSnapShot As Long, lppe As MODULEENTRY32) As Long

'参数: Handle hSnapshot传入的Snapshot句柄
'参数:LPMODULEENTRY3 lpme 指向一个 MODULEENTRY32结构的指针
'作用: 从Snapshot得到下一个Module记录信息
Private Declare Function Module32Next Lib "kernel32" (ByVal hSnapShot As Long, lppe As MODULEENTRY32) As Long

'关闭句柄
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Type PROCESSENTRY32
dwSize As Long '结构大小
cntUsage As Long '此进程的引用计数
th32ProcessID As Long '进程ID
th32DefaultHeapID As Long '进程默认堆ID
th32ModuleID As Long '进程模块ID
cntThreads As Long '此进程开启的线程计数
th32ParentProcessID As Long '父进程ID
pcPriClassBase As Long '线程优先权
dwFlags As Long '保留
szExeFile As String * 260 '进程全名
End Type

Private Const TH32CS_SNAPPROCESS = &H2 'TH32CS_SNAPPROCESS -在快照中包含系统中所有的进程?
Private Const TH32CS_SNAPmodule = &H8 '表示对象为由th32ProcessID参数指定的进程调用的所有模块

Private Type MODULEENTRY32
dwSize As Long '指定结构的大小,在调用Module32First前需要设置,否则将会失败
th32ModuleID As Long '模块号
th32ProcessID As Long '包含本模块的进程号
GlblcntUsage As Long '本模块的全局引用计数
ProccntUsage As Long '包含模块的进程上下文中的模块引用计数
modBaseAddr As Byte '模块基地址
modBaseSize As Long '模块大小(字节数)
hModule As Long '包含模块的进程上下文中的hModule句柄
szModule As String * 256 '模块名
szExePath As String * 1024 '模块对应的文件名和路径
End Type

'*************************************************************************
'**函 数 名: GetProcess
'**输 入: ByVal frmRuningProcess(Form) - 直接传入各对象名
'** : ByVal treProcess(TreeView) -
'** : ByVal lblProcessNumber(Label) -
'**输 出: 无
'**功能描述:建立进程树结构
'**全局变量:
'**调用模块:
'**作 者: Mr.David
'**日 期: 2007-11-27 14:09:37
'**修 改 人:
'**日 期:
'**版 本: V1.0.0
'*************************************************************************
Public Sub GetProcess(ByVal frmRuningProcess As Form, ByVal treProcess As TreeView, ByVal lblProcessNumber As Label)

Dim lngResult As Long
Dim hSnapShot As Long '这些定义和VB定义有点不同,由于是Api使用,那就保留其所有权了。
Dim hMSnapshot As Long

Dim strTreTxt As String
Dim lngRet As Long
Dim treNode As Node
Dim lngProcCount As Long
Dim strTreKey As String

Dim MEY As MODULEENTRY32
Dim PEE As PROCESSENTRY32

On Error GoTo PROC_ERR

hSnapShot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0) '快照所有进程

PEE.dwSize = Len(PEE)
MEY.dwSize = Len(MEY)

lngResult = ProcessFirst(hSnapShot, PEE) '获取第一进程

'外循环读取进程名
Do While lngResult <> 0

lngProcCount = lngProcCount + 1 '累计进程数

hMSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPmodule, PEE.th32ProcessID) '快照当前进程模块
MEY.szExePath = Space$(256)

strTreKey = PEE.szExeFile '对树根关键字采用的PEE.szExeFile,注意运行同一程序多个实例会转入PROC_ERR处理
strTreTxt = PEE.szExeFile

Set treNode = treProcess.Nodes.Add(, , strTreKey, strTreTxt) '进程树根是进程名

lngRet = Module32First(hMSnapshot, MEY)

'内循环读取模块名
Do While lngRet > 0

'注意一个进程的最后一个模块列出后继续列出下一个会出现类似 ??1??鏴? 的名称,这显然不是我们需要的,排除了。
'另外TreeView控件会自己处理文件名的Chr(0)字符,我们就由它处理了。
If InStr(1, MEY.szExePath, "?") = 0 Then

Set treNode = treProcess.Nodes.Add(strTreKey, tvwChild, , MEY.szExePath) '列出模块

End If

lngRet = Module32Next(hMSnapshot, MEY) '获取下一模块

Loop

'treNode.EnsureVisible '展开分支,可以选用这句
Call CloseHandle(hMSnapshot) '关闭模块快照句柄
lngResult = ProcessNext(hSnapShot, PEE) '获取下一进程

Loop

Call CloseHandle(hSnapShot) '关闭进程快照句柄

lblProcessNumber.Caption = "当前进程数:" & lngProcCount
lblProcessNumber.Visible = True

Exit Sub

PROC_ERR:

'如果发生集合中的关键字不唯一,则关键字重命名,比如Nt系统会存在多个Svchost进程,此关键字这里不重要,随便处理一下
If Err.Number = 35602 Then strTreKey = strTreKey & "1"
Resume

End Sub

调用例子:
'先分别添加一个TreeView命名为treProcess,和Label命名为lblProcessNumber。
treProcess.Nodes.Clear
Call GetProcess(frmRuningProcess, treProcess, lblProcessNumber)
参考技术A 不明白

python如何将多个进程同时运行成千上万个进程

在我的多处理流程中,我将不得不启动成千上万个进程,但是如果同时启动所有这些进程,恐怕服务器将耗尽内存。

我试图阅读python文档,但是对于如何实现这一点我有些困惑...

明确说明我要完成的事情。...

  1. 创建许多进程
  2. 设置一次要运行的一定数量(x)。
  3. 具有python启动(x)个进程,并在它们完成时,启动更多创建的进程,最多(x)个正在运行的进程
答案

根据我对您问题的(有限的)理解,我认为您可能将工作和流程等同起来。换句话说,即使您仅want个同时运行(n个需要个进程即可运行x个作业。那就是泳池的用途。

https://docs.python.org/3.7/library/multiprocessing.html#using-a-pool-of-workers

基本上,您像这样建立了一个工作进程池(代码示例是该文档的简化版本:]

from multiprocessing import Pool

def f(x):
    return x*x

with Pool(processes=4) as pool:
    result = pool.apply_async(f, (20,))
        print(res.get(timeout=1))

这样,您最多只能启动4个工作进程(或n,视情况而定),并且可以向它们发送无限数量的任务。工人空闲后,池将相应地调度任务。

EDIT:如Olvin Roght的评论中所述,也有https://docs.python.org/3/library/concurrent.futures.html#processpoolexecutor

根据我的经验,这取决于您要实现的目标。如果您只是想更好地掌握多处理,那么常规池就可以了。它也是较低的抽象级别,因此将迫使您真正了解自己在做什么。我是这样学习的,不要后悔。如果只是为了完成工作,则并发.futures版本更好。更高的抽象级别和非常好的API。

EDIT 2-关于阻止get()和超时。

from multiprocessing import Pool, TimeoutError
import time


def f(x):
    time.sleep(x)
    return "I'm rested now"


if __name__ == '__main__':
    # start 4 worker processes
    with Pool(processes=4) as pool:
        res = pool.apply_async(f, (10,))  # run in one process
        while True:
            try:
                print(res.get(timeout=1))
            except TimeoutError:
                print("No result yet")
            else:
                break

如您所见,我有一个函数休眠数秒,我将其赋给池以值10执行(这意味着该函数将在工作进程中休眠10秒,然后返回结果。 。这模拟了耗时的工作)。

[在主要过程中,我尝试以1s的超时来获取结果,这意味着1s之后,停止尝试并打印未找到任何结果(尚未)(我通过捕获get抛出的TimoutError来做到这一点)。所有这些都是循环的,因此当工作进程最终完成时,我得到了结果。正如您所看到的,您的工作进程终止的原因是您的主进程因尚未捕获的TimoutError而终止(要记住的是,这些工作进程的寿命与主进程相关)。

PS:共享一些代码,如果需要更多帮助,请让我更好地了解您要实现的目标。我几乎无法估计您对这些概念的理解,更不用说猜测您正在努力实现的目标了。很难提供帮助。我的意思是,如果您只想了解多处理概念,那一切都很好,我认为有关多处理的文档以及关于SO的问题将带您到那里,但是如果您实际上是在尝试完成一些工作,那是更高级别的库,可以为您完成大部分繁重的工作(想到芹菜,但这不是唯一的库)。

以上是关于vb如何同时读取多个进程名相同的进程的主要内容,如果未能解决你的问题,请参考以下文章

抢购高并发问题

如何在同时运行时阻止两个Node进程插入完全相同的数据库记录?

多个进程如何在 Erlang 中同时使用一个公共列表?

多个用户同时读取密钥时的 web.config 问题

python如何将多个进程同时运行成千上万个进程

如何在一个Docker中同时运行多个程序进程?