delphi
function GetThreadsList(dwProcessId: DWORD; out hList: Tlist): Boolean;
type
PThreadsInfo = ^TThreadsInfo;
TThreadsInfo = record
dwThreadID : dword;
dwUsage : dword;
Priority : dword;
end;
var
hSnapShot: THandle;
ThreadsInfo : PThreadsInfo;
ThreadEntry32: TThreadEntry32;
begin
hList := TListCreate;
hListClear;
hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
ThreadEntry32dwSize := Sizeof(TThreadEntry32);
Result := Thread32First(hSnapShot, ThreadEntry32);
while Result do begin
if dwProcessId = ThreadEntry32th32OwnerProcessID then
try
New(ThreadsInfo);
with ThreadsInfo^, ThreadEntry32 do begin
dwThreadID := th32ThreadID;
dwUsage := cntUsage;
Priority := tpBasePri;
end;
hListAdd(ThreadsInfo);
finally
end;
Result := Thread32Next(hSnapShot, ThreadEntry32);
end;
end;
c++
void FillThreadList(CMyListCtrl &lstCtrl)
{
/if (m_dwProcessID <= 0)
{
return;
}/
//清空列表
lstCtrlDeleteAllItems();
//创建进程映像快照
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hSnap == NULL)
{
AfxMessageBox("创建线程映像快照失败!");
return;
}
THREADENTRY32 th = {0};
thdwSize = sizeof(THREADENTRY32);
//检索系统中第一个进程快照信息
if (!Thread32First(hSnap, &th))
{
AfxMessageBox("查找进程线程失败!");
}
else
{
CString txtBasePri, txtThreadID, txtHThread, txtCntUsage;
do
{
if (thth32OwnerProcessID == m_dwProcessID)
{
txtThreadIDFormat("%d", thth32ThreadID);
txtBasePriFormat("%d", thtpBasePri);
txtCntUsageFormat("%d", thcntUsage);
txtHThreadFormat("%08X", thth32OwnerProcessID);
lstCtrlAddItem(txtThreadID, txtHThread, txtBasePri, txtCntUsage);
ZeroMemory(&th, 0);
thdwSize = sizeof(THREADENTRY32);
}
}
while (Thread32Next(hSnap, &th));//检索系统中的下一个进程快照信息
lstCtrlAutoSize();
txtBasePriFormat("ProcessThreadManager - [线程数:%d]", lstCtrlGetItemCount());
SetWindowText(txtBasePri);
}
CloseHandle(hSnap);
}
C# 改怎么写总该明白了吧,
获得线程ID 下步该干什么?
function OpenThread( dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwThreadId: DWORD): THandle; stdcall;
打开线程,获取句柄,或者直接暂停 启动
百度贴吧档次太低了 你想找答案换个地方吧。。。回答问题的人基本都是文不对题,人家问怎么获取程序中的线程,你管他那么多,管他干什么呢~
Var
MT: TMyThread;
Begin
MT := TMyThreadcreate(Nil);
MTFreeOnTerminate := True;
MTOnTerminate := ThreadDone;
End;
Procedure TForm1ThreadDone(Sender: TObject);
Begin
DataSource1DataSet := (Sender As TMyThread)DataSet;
End;
就以下两个方面来讲解以下在delphi中如何用多线程进行数据采集:
---- 1 多线程进行数据采集应解决的问题
---- 其实,多线程程序设计复杂是暂时的;如果,你采用传统的C进行多线程的设计,那么你必须自己控制线程间的同步。那将是很复杂的。但是,如果利用面向对象的设计方法,采用Delphi进行多线程程序设计,问题就简单多了。这是因为,Delphi已将多线程的复杂性替我们处理了,我们所要做的就是继承。
---- 具体地说,多线程数据采集需要完成以下工作:
---- ① 从TThread类派生一个自己的类SampleThread。这就是我们用于数据采集的类。进行采集时,只需要简单地创建一个SampleThread的实例。
---- ② 重载超类TThread的Execute方法。在这一方法中将具体地执行数据采集任务。
---- ③ 如果希望一边采集一边显示,就在编写几个用于显示采集进度的过程,供Execute方法调用。
---- TThread类中最常用的属性/方法如下:
Create方法:constructor Create
(CreateSuspended: Boolean);
---- 其中CreateSuspended参数确定线程在创建时是否立即执行。如果为True,新线程在创建后被挂起;如果为False,线程在创建后立即执行。
FreeOnTerminate属性:
property FreeOnTerminate: Boolean;
---- 该属性确定程序员是否负责撤消该线程。如果该属性为True,VCL将在该线程终止时自动撤消线程对象。它的缺省值为False。
OnTerminate属性:
property OnTerminate: TNotifyEvent;
---- 该属性指定一个当线程终止时发生的事件。
---- 下面看一个具体的例子:
---- 2 多线程数据采集的实现
---- 这是笔者开发的一个测抽油机功图的程序。它的功能是采集抽油机悬点的载荷及位移数据,经过处理后做出抽油机的功图。图1(略)所示是数据采集时的界面。点“采集数据”按钮后,程序将创建一新的线程,并设置其属性。这一新线程将完成数据采集任务。程序如下:
Procedure TsampleForm
DoSampleBtnClick(Sender: TObject);
Begin
ReDrawBtnEnabled := True;
DoSampleBtnEnabled := False;
FFTBtnEnabled := True;
TheSampler := SampleThreadCreate(False);
创建采集线程
TheSamplerOnTerminate := FFTBtnClick;
采集完成后要执行的任务
TheSamplerFreeOnTerminate := True;
采集完成后撤消
End;
---- 采集线程的类定义如下:
Type
SampleThread = class(TThread)
Public
function AdRead(ach: byte): integer; safecall;
读A/D卡的函数
procedure UpdateCaption;
显示采集所用时间
private
{ Private declarations }
protected
thes, thep: real;
dt: real;
id: integer;
st, ed: LongInt;
procedure Execute; override;
这是关键。
End;
---- 在这个类中定义了一个函数AdRead用于 *** 作A/D卡,两个过程用于显示采集的进度与所用时间。需要注意的是AdRead函数是用汇编写的,参数调用格式必须是safecall。
---- 关键的重载方法Execute的代码如下:
Procedure SampleThreadExecute;
Begin
StartTicker := GetTickCount;
id := 0;
Repeat
thes := Adread(15) ad2mv mv2l;
采集第15通道
thep := Adread(3) ad2mv mv2n;
采集第3通道
dt := GetTickCount - StartTicker;
sarray[id] := thes;
parray[id] := thep;
tarray[id] := dt;
inc(id);
Synchronize(UpdateCaption);
注意:显示采集进度
Until id >=4096;
ed := GetTickCount;
Synchronize(ShowCostTime);
注意:显示所用时间
end;
---- 从以上代码中可见,Execute与一般的代码并无本质区别。仅有的区别是显示采集进度和显示所用时间时,不能直接调用各自的过程,而是通过调用Synchronize间接地调用。这样作是为了保持进程间的同步。
delphi线程池的原理很简单,类似于 *** 作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。可能你也许会问:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的线程不就完了?这也许是个不错的方法,因为它能使得你编写代码相对容易一些,但你却忽略了一个重要的问题性能!就拿我所在的单位来说,我的单位是一个省级数据大集中的银行网络中心,高峰期每秒的客户端请求并发数超过100,如果为每个客户端请求创建一个新线程的话,那耗费的CPU时间和内存将是惊人的,如果采用一个拥有200个线程的线程池,那将会节约大量的的系统资源,使得更多的CPU时间和内存用来处理实际的商业应用,而不是频繁的线程创建与销毁。
在 Delphi 中,子线程的重启实际上并不是一个常见的需求,因为一旦子线程完成或终止,它就不再存在。如果您需要在应用程序执行期间多次使用相同的子线程,通常会创建一个新的线程实例而不是重新启动先前的线程实例。
如果您确实需要重新启动子线程,则必须小心处理以避免出现竞争条件和内存泄漏等问题。具体来说,您需要停止当前正在运行的线程,并在必要时清除任何线程相关的资源(例如,在线程结束时释放分配的内存)。然后,创建一个新的线程实例并启动它,以便它可以开始工作。
要停止正在运行的线程,您可以使用 TThread 类中的 Terminate 方法来标记线程应该停止运行。然后,您可以使用 WaitFor 方法等待线程退出。
接下来,您需要确保清除任何线程相关的资源。这可能包括释放内存、关闭打开的文件等。最好将此代码放在 TThread 子类的 Execute 方法中,以确保在线程退出时正确地清理资源。
最后,您可以创建一个新的线程实例并启动它,以便它可以开始工作。要创建线程,请使用 TThread 子类或基于 TThread 的自定义线程类的构造函数。然后,调用 Start 方法以启动线程
这种问题必须要应用多线程处理,关于你本身的问题你可以用线程池来处理,这个开销比新创建线程要小一些,须要你本身写一个线程池处收成重点是可以快速取到余暇线程),3 解算后的数据发出,当时光包含在2中的最大年夜耗不时光内1 接收事宜触发接收过程,进行数据预处理我不知道你的预处理是否是必须的,并且必须是在线程处理之前完成,我认为接收事宜触发接收过程,收到数据立时放入主线程(也就是我说的线程池治理线程),之后你的过程持续等待下一波数据,而子线程开端处理数据。2 数据预处理后,发出自定义事宜或者消息触发数据解算线程,解算最大年夜耗时200-250ms,最小100ms没须要定义什么自定义消息,你可以在主线程中,等待子线程完成计算,然后做最后的处理。计算后的数据须要发出? 那一样的事理,按照次序发出即可。
打字不易,如满意,望采纳。
以上就是关于C# 如何获得当前程序运行中的所有线程。并且 暂停 和 恢复运行全部的内容,包括:C# 如何获得当前程序运行中的所有线程。并且 暂停 和 恢复运行、delphi ADO 线程获取数据,表格显示不正常,求解。、Delphi 如何用多线程进行数据采集等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)