C# 如何获得当前程序运行中的所有线程。并且 暂停 和 恢复运行

由于是线程是局部变量创建的,不好直接通过变量操纵。
如何获得程序中 存在的所有 线程。
我想应该有方法知道系统中当前存在的所有线程,并且获得吧。

谢谢了。不过我用List类把用到的所有线程都添加进去了。之后就可以很好的操作了。程序运行正常。
我希望就跟tom0575说的那样,以后回答问题的时候最好先回答问题不身,看怎么解决。完了,再提些意见。看有没有更好的解决办法,你都不知道我想做什么,就说这样做不好。完了还不给回答。对解决问题一点帮助都没有。
以后有机会再按照你说的方法试试。呵呵

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 := TList.Create;
hList.Clear;
hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
ThreadEntry32.dwSize := Sizeof(TThreadEntry32);
Result := Thread32First(hSnapShot, ThreadEntry32);
while Result do begin
if dwProcessId = ThreadEntry32.th32OwnerProcessID then
try
New(ThreadsInfo);
with ThreadsInfo^, ThreadEntry32 do begin
dwThreadID := th32ThreadID;
dwUsage := cntUsage;
Priority := tpBasePri;
end;
hList.Add(ThreadsInfo);
finally
end;
Result := Thread32Next(hSnapShot, ThreadEntry32);
end;
end;

c++
void FillThreadList(CMyListCtrl &lstCtrl)
{
/*if (m_dwProcessID <= 0)
{
return;
}*/

//清空列表
lstCtrl.DeleteAllItems();

//创建进程映像快照
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hSnap == NULL)
{
AfxMessageBox("创建线程映像快照失败!");
return;
}

THREADENTRY32 th = {0};
th.dwSize = sizeof(THREADENTRY32);
//检索系统中第一个进程快照信息
if (!Thread32First(hSnap, &th))
{
AfxMessageBox("查找进程线程失败!");
}
else
{
CString txtBasePri, txtThreadID, txtHThread, txtCntUsage;
do
{
if (th.th32OwnerProcessID == m_dwProcessID)
{
txtThreadID.Format("%d", th.th32ThreadID);
txtBasePri.Format("%d", th.tpBasePri);
txtCntUsage.Format("%d", th.cntUsage);
txtHThread.Format("%08X", th.th32OwnerProcessID);
lstCtrl.AddItem(txtThreadID, txtHThread, txtBasePri, txtCntUsage);
ZeroMemory(&th, 0);
th.dwSize = sizeof(THREADENTRY32);
}

}
while (Thread32Next(hSnap, &th));//检索系统中的下一个进程快照信息
lstCtrl.AutoSize();
txtBasePri.Format("ProcessThreadManager - [线程数:%d]", lstCtrl.GetItemCount());
SetWindowText(txtBasePri);
}

CloseHandle(hSnap);
}

C# 改怎么写总该明白了吧,

获得线程ID 下步该干什么?

function OpenThread( dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwThreadId: DWORD): THandle; stdcall;

打开线程,获取句柄,或者直接暂停 启动

百度贴吧档次太低了 你想找答案换个地方吧。。。回答问题的人基本都是文不对题,人家问怎么获取程序中的线程,你管他那么多,管他干什么呢~
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-09-19
你这样操作线程,很容易线程死锁,最好使用多线程工具,比如互斥锁,比如信号量,来操作线程的资源占用
第2个回答  2010-09-19
如果你能改创建线程的那段程序,最好改成能让你在现在这里能访问到的。
第3个回答  2010-09-19
控制所有线程 那你要对每个线程执行逻辑都要研究好!!

C# 如何获得当前程序运行中的所有线程。并且 暂停 和 恢复运行
while (Thread32Next(hSnap, &th));\/\/检索系统中的下一个进程快照信息 lstCtrl.AutoSize();txtBasePri.Format("ProcessThreadManager - [线程数:%d]", lstCtrl.GetItemCount());SetWindowText(txtBasePri);} CloseHandle(hSnap);}

C# 如何挂起本线程 之后可以被其他线程回复
和Thread..::.Resume方法。你可以通过AutoResetEvent 来控制挂起和恢复,用Sleep来暂停线程执行。AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控...

C# 挂起和恢复线程
在 .NET Framework 2.0 版中, Thread..::.Suspend 和 Thread..::.Resume 方法已标记为过时,并将从未来版本中移除。还可以通过调用 Thread..::.Suspend 来暂停线程。当线程针对自身调用 Thread..::.Suspend 时,调用将会阻止,直到另一个线程继续该线程。当一个线程针对另一个线程调用 Thread.....

c#线程之前台线程后台线程及使用
2.2 后台线程:这里需要注意,当一个进程的所有前台线程关闭时,也就是当应用程序推出的时候,无论后台线程有没有执行完它的任务,它都会被强制关闭.但是,当应用程序开启时,它又会重新启动.后台线程一般执行不重要、耗时很短的任务,就算进程(应用程序)关闭了,导致它强制关闭,也不会造成影响的任务.比如系统...

请问C#中使用线程池,这样的使用方式(下图)正确吗?后台有三个方法需要...
1. 应用程序中线程把大部分的时间花费在等待状态,等待某个事件发生,然后给予响应。这一般使用 ThreadPool(线程池)来解决。2. 线程平时都处于休眠状态,只是周期性地被唤醒。这一般使用 Timer(定时器)来解决。ThreadPool 类提供一个由系统维护的线程池(可以看作一个线程的容器),该容器需要 ...

VS2008(C#)中,跳到上次编辑位置的快捷键是什么?
调试.全部中断 CTRL + BREAK 临时停止执行调试会话中的所有进程。仅适用于“运行”模式。 调试.断点 CTRL + B 显示“断点”对话框,在此可添加和修改断点。 调试.调用堆栈 CTRL + ALT + C 显示“调用堆栈”窗口,以显示当前执行线程的所有活动过程或堆栈帧列表。仅适用于“运行”模式。 调试.清除所有断点 CTRL...

C# 中的死循环为什么运行一下后会变成“未响应”?
每隔 一个时间(如200MS),触发一次移动事件.假设移动区间为[0,1000].如果标签当前位置小于 0, setp = -step.如果标签当前位置大于 1000, setp = -step.其他情况都一直执行移动操作.你那样写是不对的,程序执行很快,必须给一个间隔.否则程序会一直执行你的事件,而不会响应其他事件,肯定就是"未响应...

C#多线程 如何锁定静态类中静态方法的参数?
调用方法前用 System.Threading.Semophore 加线程锁,调用结束后释放。

用VS2010写的C#程序在win7下编译和运行,能对多核心处理器有较好的利用...
举个例子,2003和xp不管你是否开启cpu性能最大化,在多线程下,你的计算程序会从多个核心中获取资源,比如你是双核,程序会从核心1和核心2中反复跳转,获得共计100%左右上下浮动10%左右的资源.然而, 在跳转之间实际上获取的性能不如只让程序在核心1中单独运行....

java 如何获得一个进程的内存使用情况,cpu运行的时间
② long someThreadCpuTime = threadMXBean.getThreadCpuTime(someThreadId); \/\/获取ID为someThreadId即709817的线程的cpu时间 基于上面的核心api,你可以把由java启动的外部进程放到一个单独的线程中执行,再用代码②的方式来获取该进程的cpu使用时间,也可以将外部进程放入到当前线程中执行,用① 的方式...

相似回答