我的线程为什么中止不了呢?很急!!!!!!!!!

cyh_enigma 2002-10-22 04:48:37
我线程的流程是:
UINT CMyClass::ThreadProc(LPVOID pParam)
{
CMyClass* myclass = (CMyClass*) pParam;
while( !(myclass->m_bStop)) //true)
{
........//My work
}
return 0;
}

void MyClass::StartThread()
{
CWinThread* pThread = AfxBeginThread(ThreadProc, this);
if (pThread!=NULL)
{
m_hThread = pThread->m_hThread;
m_bStop = false;
}
}

void MyClass::EndThread()
{
//终止线程
m_bStop = true;
WaitForSingleObject(m_hThread, INFINITE)
}
我在MyProjectAPP中调用EndThread(),我单步执行,程序一旦跳到这个函数中,好像整个程序都死了,线程卡在一个地方退不出来了,waitforsingleobject无限等待。为什么?哪会出问题呢?
...全文
23 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
alanwang_ 2002-10-31
  • 打赏
  • 举报
回复
你可以单步跟踪线程,来确认子线程到底是堵在哪个函数上了。
Zark 2002-10-23
  • 打赏
  • 举报
回复
建议拿掉那句
WaitForSingleOjbect();
试试。


按我的理解,这个函数是阻塞的,而且在你的的代码中,没有必要在ENDTHREAD()等线程返回。


Zark 2002-10-23
  • 打赏
  • 举报
回复
建议拿掉那句
WaitForSingleOjbect();
试试。


按我的理解,这个函数是阻塞的,而且在你的的代码中,没有必要在ENDTHREAD()等线程返回。


Zark 2002-10-23
  • 打赏
  • 举报
回复
建议拿掉那句
WaitForSingleOjbect();
试试。


按我的理解,这个函数是阻塞的,而且在你的的代码中,没有必要在ENDTHREAD()等线程返回。


cyh_enigma 2002-10-23
  • 打赏
  • 举报
回复
我发现当窗口响应我的WM_KEYDOWN消息,并消息响应中调用到我的MyProjectApp::KillAllThreads()中,在这个函数里,我没走几步,我CMyClass中的线程就已经死在while(!m_bStop)内的一个函数上,我不知道为什么,因为这个线程在工作时一直是正常的。最后,我在KillAllThreads()函数内第一行写
m_MyClass.m_bStop = TRUE;后,线程就能正常结束了,放在其他位置不行,我不知道为什么,跟线程的时间片有关系么?
你如果知道为什么,能不能告诉我,e_mail:yanhuacui@sina.com
我先把分分给大家,谢谢
双杯献酒 2002-10-23
  • 打赏
  • 举报
回复
另外,您需要在StartThread中,把 m_bStop=false提前,

m_bStop=false;// !!!!!
CWinThread* pThread = AfxBeginThread(ThreadProc, this);
双杯献酒 2002-10-23
  • 打赏
  • 举报
回复
您可以在ThreadProc结束前,打印一条信息,
以便确认是否退出。

TRACE0("ThreadProc End\n");
return 0;
foxustc 2002-10-23
  • 打赏
  • 举报
回复
建议你对程序做如下修改:
线程函数声明为static,亦即:
staitc UINT CMyClass::ThreadProc(LPVOID pParam)

在StartThread中,把m_bStop放在AfxBeginThread之前:
void MyClass::StartThread()
{
m_bStop = false;
m_hThread = NULL;
CWinThread* pThread = AfxBeginThread(ThreadProc, this);
if (pThread!=NULL)
{
m_hThread = pThread->m_hThread;
}
else
{
m_bStop = true;
}
}

void MyClass::EndThread()
{
//终止线程
m_bStop = true;
WaitForSingleObject(m_hThread, INFINITE)
}

不知道是否能解决你的问题,祝好运!
双杯献酒 2002-10-23
  • 打赏
  • 举报
回复
首先,ThreadProc(LPVOID pParam)应该是static的,
static UINT ThreadProc(LPVOID pParam);
其次,
m_bStop 应该是volatile的
volatile bool m_bStop;
Gladstone 2002-10-23
  • 打赏
  • 举报
回复
建议把线程和终止线程变量都声明为全局的。
wildrabbit 2002-10-23
  • 打赏
  • 举报
回复
把你的代码给得更详细些!!!
cyh_enigma 2002-10-23
  • 打赏
  • 举报
回复
还是不行呀
In355Hz 2002-10-23
  • 打赏
  • 举报
回复
建议把 m_bStop 定义为易变型变量:BOOL volatile m_bStop;
cyh_enigma 2002-10-23
  • 打赏
  • 举报
回复
对不起,我前面的代码写得不全,我的ThreadProc是static UINT型,而且
m_bStop = false;也确实上AfxBeginThread前面。我的线程工作正常,可就是结束不了,线程运行时,m_bStop一直是false.但是我听从iicup的建议加了
TRACE0("ThreadProc End\n");并在这一句前设了断点
return 0;
但是程序没有停在这里就死了,很明显,线程没有结束。我的主线程有一个窗口,当窗口接受到WM_KEYDOWN消息后,主线程就调用CMyClass::EndThread(),这样做难道不合理么?
我一按键,马上就跳到主线程中了,线程就好像被挂起来了,why?why?why?

Zark 2002-10-23
  • 打赏
  • 举报
回复
在叫
CWinThread* pThread = AfxBeginThread(ThreadProc, this);
之前
m_bStop是何值?????

查查吧!
cyh_enigma 2002-10-22
  • 打赏
  • 举报
回复
我试过把它改为全局变量,也不行。我单步执行,只要一到WaitForSingleObject程序就死了,无法跳到线程里的断点,就好像线程被挂起一样,why?why?why?
wildrabbit 2002-10-22
  • 打赏
  • 举报
回复
将线程函数改为UINT ThreadProc(LPVOID pParam)即可,我在我的机器上已调试通过
core 2002-10-22
  • 打赏
  • 举报
回复
实际上你的线程函数参数为:
UINT CMyClass::ThreadProc(CMyClass *p, LPVOID pParam)

加上static就可以了
static UINT CMyClass::ThreadProc(LPVOID pParam)

mess 2002-10-22
  • 打赏
  • 举报
回复
检查一下你的
{
........//My work
}
的代码

例外可以在执行m_bStop = true
时在while( !(myclass->m_bStop)) //true)设置断点,
跟踪,看是否执行了;(可以在m_bStop = true之后加一条语句,在这条语句也设置断点)
wildrabbit 2002-10-22
  • 打赏
  • 举报
回复
检查一下你的CMyClass是不是全局变量,或者是在堆中生成的.要是在栈中生成的或是局部变量就会有问题,或者你将线程函数命名为全局的如:UINT  ThreadProc(LPVOID pParam),另外:你在线程之间传递MFC对象指针,是不安全的。
加载更多回复(1)

15,471

社区成员

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

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