关于如何终止线程的问题

maofly 2004-09-10 02:00:10
有一个主程序和三个MFC DLL A,B,C;在A DLL中的主界面中有两个按钮:开始和停止。点击“开始”按钮,调用C DLL中的函数并且在C DLL的该函数中产生一个线程(用AfxBeginThread产生,线程函数为static 型),该线程函数又调用B DLL中的函数执行(该函数执行一组动作,处理的数据对象为一个全局char型数组)。
程序一执行(点击开始按钮),整个界面就冻住,停止按钮按不了,必须等这组动作执行完才行!
请问,我要怎样做才能中途停止????
急,望各位大虾不吝赐教,谢谢!!!!
...全文
404 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljhlmy 2004-09-16
  • 打赏
  • 举报
回复
up
ljhlmy 2004-09-16
  • 打赏
  • 举报
回复
大家来看看
ljhlmy 2004-09-16
  • 打赏
  • 举报
回复
我调用TerminateThread()不能终止线程是怎么回事?

UINT StartupRetrieve(LPVOID pParam)
{
struct sMsgDatabaseSend *pData=(struct sMsgDatabaseSend *)pParam;
CWinThread* m_MsgRetrieveThread;
m_MsgRetrieveThread = AfxBeginThread(test_temp,pData);
Sleep(2000);
TerminateThread(m_MsgRetrieveThread,0 );
return 0;
}

UINT test_temp(LPVOID pParam)
{
while(1)
{
WriteStrLog("启运test");
Sleep(1000);
}
return 0 ;
}

我在第一个线程中启动第二个线程,sleep(2000)后将其终止,但是系统不终止是怎么回事?
piero_csa 2004-09-15
  • 打赏
  • 举报
回复
你那个c-dll函数是不是本身就是个循环_直到线程结束?如果是线程死循环界面也不应该死锁啊!
123456754321 2004-09-15
  • 打赏
  • 举报
回复
,
maofly 2004-09-15
  • 打赏
  • 举报
回复
我曾降低它的 优先级试过,但没用!
maofly 2004-09-15
  • 打赏
  • 举报
回复
我查看了任务管理器,CPU时间一直被占用。但是如果 说WORK线程没开起来,那线程函数怎么执行(因为线程函数调用的函数执行了,就是因为它的执行,则占据着整个CPU时间,但该函数操作的是一个全局数组,所以我不能在某个地方用SLEEP)?
我想在执行操作的中途停止它,不是 说我不会停止,而是说整个界面被冻住了,我无法点停止按钮!
请问,我该怎么办?
maofly 2004-09-15
  • 打赏
  • 举报
回复
我查看了任务管理器,CPU时间一直被占用。但是如果 说WORK线程没开起来,那线程函数怎么执行(因为线程函数调用的函数执行了,就是因为它的执行,则占据着整个CPU时间,但该函数操作的是一个全局数组,所以我不能在某个地方用SLEEP)?
我想在执行操作的中途停止它,不是 说我不会停止,而是说整个界面被冻住了,我无法点停止按钮!
请问,我该怎么办?
loseme915 2004-09-13
  • 打赏
  • 举报
回复
在适当的地方Sleep一下,终止线程可以用SetEvent啊!在线程中waitForSingleObject()
Mr-Chen 2004-09-13
  • 打赏
  • 举报
回复
TerminateThread暴力终止或者你在线程的循环里事先设置一个判断条件,终止时让条件为假就可以跳出线程
你的工作线程冻住了主线程,这个原则上好像不可能,检查你的线程你有没有频繁的耗时和资源占用语句,或者加上延时语句,保证你的窗口消息能够被接收
kvls 2004-09-10
  • 打赏
  • 举报
回复
这是因为您在DLL中创建的线程占用了CPU资源,主线程(界面)不能获取CPU进行执行造成的。您可以降低您在DLL中的后台线程级别,在后台线程中的合适位置加入Sleep让它让出适当的CPU时间等方式来避免。
cambest 2004-09-10
  • 打赏
  • 举报
回复
一定要使用MFC线程来完成吗?我常用Windows API来创建线程,不会遇到这样的问题。
bobzhu2002 2004-09-10
  • 打赏
  • 举报
回复
线程在执行完后,还会返回到消息循环来做判断的,如果某个条件满足,它就跳出,这样可以保证线程做完它的工作

但我现在遇到的问题时,在对话窗体里执行这样的消息循环的话,线程是可以正确执行的,假定我们用一个按钮来激活此事件,那第一次工作是对,但第二次总是不能连续工作,需要人触摸一下鼠标它才能退出消息循环往下走

我苦思不得其解,哪位知道原因?
oyljerry 2004-09-10
  • 打赏
  • 举报
回复
要么就在线程中设一个判断条件,可以让线程跳出来
zj888 2004-09-10
  • 打赏
  • 举报
回复
工作线程冻住了界面线程?
kugou123 2004-09-10
  • 打赏
  • 举报
回复
之所以主界面被冻住,是因为执行线程的时候,窗口消息得不到及时的处理才会这样,你可以在窗口中,自己重载消息循环的函数。

void DoEvents(){
MSG msg;
if(::PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}

终止线程,就用TerminateThread();
DentistryDoctor 2004-09-10
  • 打赏
  • 举报
回复
程序一执行(点击开始按钮),整个界面就冻住,停止按钮按不了,必须等这组动作执行完才行!?????????
你的工作是在主线程中完成吧,建立一工作线程,用事件等与工作线程同步,
allenq 2004-09-10
  • 打赏
  • 举报
回复
哈哈, 你的主界面为什么会冻住啊?你用系统的任务管理器看看, 到底新产生了线程没有啊??
allenq 2004-09-10
  • 打赏
  • 举报
回复
另外加个按钮
::TerminateThread( m_ThreadA->ThreadID );
强制终止就行了啊.

15,471

社区成员

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

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