::SuspendThread( hThread1);这个函数怎么有时候可以暂停线程,有时候不可以暂停

p5655364p 2010-08-26 05:36:16
::SuspendThread( hThread1);这个函数怎么有时候可以暂停线程,有时候不可以暂停,我是在程序中创建10个线程,然后对应的去暂停,但是好像不可以暂停了,我在创建线程传递给线程函数一个结构体数组,会不会是这个原因啊,还是什么原因,谢谢回答的人
...全文
351 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly4free 2010-08-31
  • 打赏
  • 举报
回复
换个思路把,你为什么要suspendthread?
它就是使某线程不再参加“被调度”了

即使你真的调用成功了,你知道它停在哪里了吗?
「已注销」 2010-08-31
  • 打赏
  • 举报
回复
一般难以暂停,只有那个线程执行Sleep函数才可以
Eleven 2010-08-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 p5655364p 的回复:]
引用 3 楼 fangongdalu7148 的回复:
看看SuspendThread 调用成功没,,GetLastError 看看什么错误


没有调用成功,GetLastError 返回的值是6,说明这个线程句柄无效,怎么回事啊,我以前也是这样创建的,可以暂停的,但是现在不知道怎么回事?
[/Quote]
你的线程不会已经终止结束了吧。。。
begges 2010-08-28
  • 打赏
  • 举报
回复
会不会是线程已经停止运行了啊,调用之前用GetExitCodeThread看下是否运行着呢!
p5655364p 2010-08-28
  • 打赏
  • 举报
回复
你加我的qq啊,因为代码太多了,我发给你代码,你看看是什么地方出问题了
hilevel 2010-08-28
  • 打赏
  • 举报
回复
既然是线程句柄无效,那错误应该在别处
还是贴代码吧
p5655364p 2010-08-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fangongdalu7148 的回复:]
看看SuspendThread 调用成功没,,GetLastError 看看什么错误
[/Quote]

没有调用成功,GetLastError 返回的值是6,说明这个线程句柄无效,怎么回事啊,我以前也是这样创建的,可以暂停的,但是现在不知道怎么回事?
QQ282881515 2010-08-26
  • 打赏
  • 举报
回复
牵扯到内核的东西。。得看看你的线程被唤醒了几次了。若是被唤醒了两次就得调用SuspendThread两次才能挂起。内核对象里边有个计数器在计数 。 有代码就好了
zgsdzhaolanxiang1 2010-08-26
  • 打赏
  • 举报
回复
If the thread is making a kernel call, SuspendThread fails. An application might need to repeat the SuspendThread several times for it to succeed.
如果 这个线程正在调用一个内核函数,SuspendThread 失败.程序需要多调用几次SuspendThread 才能成功
zgsdzhaolanxiang1 2010-08-26
  • 打赏
  • 举报
回复
看看SuspendThread 调用成功没,,GetLastError 看看什么错误
p5655364p 2010-08-26
  • 打赏
  • 举报
回复
你加我的qq,我把代码发给你,qq是1192866550
wltg2001 2010-08-26
  • 打赏
  • 举报
回复
没有代码说不清楚
1. 创建一个基于对话框的应用程序。并增加如图所示控件;分别为3个进度条控件关联三个进度条类型的变量;并在对话框的初始化函数中,设定进度条的范围;为编辑框关联一个整型的变量;为12个按钮添加消息处理函数; 2. 定义结构体:用做线程函数的参数传递 typedef struct Threadinfo{ CProgressCtrl *progress;//进度条对象 int speed; //进度条速度 int pos; //进度条位置 } thread,*lpthread; 3. 为对话框增加三个句柄,用于标识各个线程; HANDLE hThread1; //线程1线程句柄 HANDLE hThread2; //线程2线程句柄 HANDLE hThread3; //线程3线程句柄 在增加三个结构体类型的变量,用做线程函数的参数传递; HANDLE hThread1; //线程1线程句柄 HANDLE hThread2; //线程2线程句柄 HANDLE hThread3; //线程3线程句柄 4. 新增一个静态的全局变量,用于记录所有线程的状态:static int GlobalVar=10000; 5. 声明并编写线程函数,注意只能有一个参数,且函数的返回值类型也是固定的;函数名可以自定义; DWORD WINAPI ThreadFun(LPVOID pthread);//线程入口函数 6. 在启动按钮的消息处理函数中编写如下代码: thread1.progress=&m_progress1;//进度条对象 thread1.speed=100;//速度 thread1.pos=0;//初始位置 hThread1=CreateThread(NULL,0,ThreadFun,&thread1;,0,0);//创建并开始线程 if (!hThread1) { MessageBox("创建线程失败"); } 7. 编写线程函数(一般是一个死循环,或者需要花费时间很长的算法!否者就失去了多线程的意义) DWORD WINAPI ThreadFun(LPVOID pthread) //线程入口函数 { lpthread temp=(lpthread)pthread;//参数强制转换为结构体类型 temp->progress->SetPos(temp->pos); //设置被传递过来的进度条的位置 while(temp->posspeed); /设置速度 temp->pos++; //增加进度 temp->progress->SetPos(temp->pos); //设置进度条的新位置 GlobalVar--; if(temp->pos==20) { temp->pos=0; //进度条满则归0 } } return true; } 8. 在挂起按钮函数中,编写如下代码: if(SuspendThread(hThread1)==0xFFFFFFFF) { MessageBox("挂起失败!进程可能已经死亡或未创建!"); return; } 9. 在执行按钮函数中,编写如下代码: if(ResumeThread(hThread1)==0xFFFFFFFF) { MessageBox("执行失败!进程可能已经死亡或未创建!"); return; } 10. 在停止按钮函数中,编写如下代码: if(TerminateThread(hThread1,0))//前些终止线程 { CloseHandle(hThread1);//销毁线程句柄 } else { MessageBox("终止进程失败!"); } 11. 为应用程序添加WM_TIMER消息,实时更新全局变量的值到编辑框;

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧