关于多线程,急!!

hcyang 2007-01-24 09:46:23
窗体类A中定义类B的变量数组b[4]
b[0],b[1],b[2],b[3]分别启动4个线程(不同的线程)
现在的问题是
b[0],b[1],b[2],b[3]任何一个调用窗体类A中的函数f(),就导致程序无响应
其中f()中调用WaitForMultipleObjects等待键盘鼠标事件

请问高手是什么原因,难道f()不可以被中断吗,之前单线程的时候没问题,换乘多线程就不行了
...全文
291 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hcyang 2007-01-24
  • 打赏
  • 举报
回复
wait等待的是shutdown事件或者键盘事件
尘雨 2007-01-24
  • 打赏
  • 举报
回复
这样的设计是错误的
尘雨 2007-01-24
  • 打赏
  • 举报
回复
能问你一下你在Transmit函数里的WaitForMultipleObjects等待的是线程句柄吗?
如果是等待这些线程返回,你的sendmessage永远都无法返回,因为TransFileThread0没有返回,所以wait不返回,wait不返回,sendmessage也不返回,线程死等待了,因为Transmit是对话框类的,所以主线程也堵塞了,死是肯定。你陷入一个很正确的死锁

线程等Sendmessage返回,sendmessage等wait返回,wait等线程返回,循环啊
hcyang 2007-01-24
  • 打赏
  • 举报
回复
应该不是vieri_ch说的那种情况,比如按下了F1,程序就死掉了,所以情况是第一次调用f()的时候就死掉了
hcyang 2007-01-24
  • 打赏
  • 举报
回复
KAUTODlg.h:
CTransFiles m_TransFiles[4];

KAUTODlg.cpp:
OnInitDialog(){
....
m_TransFiles[0].StartTransFiles(this, this, &m_InterfaceData[0], 0);
m_TransFiles[1].StartTransFiles(this, this, &m_InterfaceData[1], 1);
m_TransFiles[2].StartTransFiles(this, this, &m_InterfaceData[2], 2);
m_TransFiles[3].StartTransFiles(this, this, &m_InterfaceData[3], 3);
....
}
Transmit(){
....
WaitForMultipleObjects(...);
....
}

CTransFiles.cpp:
StartTransFiles(...){
....
switch( nMachine ){
case 0:
m_pThread = AfxBeginThread( TransFileThread0, this );
if ( !m_pThread ){
return FALSE;
}
else {
m_bThreadRunFlag = TRUE;
}
break;
case 1:
m_pThread = AfxBeginThread( TransFileThread1, this );
if ( !m_pThread ){
return FALSE;
}
else {
m_bThreadRunFlag = TRUE;
}
break;
case 2:
m_pThread = AfxBeginThread( TransFileThread2, this );
if ( !m_pThread ){
return FALSE;
}
else {
m_bThreadRunFlag = TRUE;
}
break;
case 3:
m_pThread = AfxBeginThread( TransFileThread3, this );
if ( !m_pThread ){
return FALSE;
}
else {
m_bThreadRunFlag = TRUE;
}
break;
}
....
}

TransFileThread0(){
while ( pTrans->m_nProgram == GO ) {
.....
if(m_buttondown){
::SendMessage(...) //调用KAUTODlg.cpp中的Transmit()
}
....
}
}

程序大体框架就是这样,当按下F1,F2,F3,F4时,将对应的m_TransFiles[]类变量的m_buttondown置为1
尘雨 2007-01-24
  • 打赏
  • 举报
回复
你应该只用一个线程去调用wait等待键盘,然后postmessage消息来通知其他线程如何运算,不应该在多个线程里直接调用主线程的同一个堵塞调用
尘雨 2007-01-24
  • 打赏
  • 举报
回复
这样来描述
线程1,通过指针访问窗口主线程的成员函数f(),该函数wait键盘(是在主线程消息循环中),没有键盘消息,主线程堵塞了,函数不返回,线程1也堵塞。
此时线程2,也访问通过指针访问f(),恰好,主线程还堵塞着,此调用无法返回,那么线程2堵塞。
其他线程也堵塞

即使你很快的按键盘,f()准备返回,线程1恢复,在这个刹那间,上下文切换到线程2,主线程又堵塞,线程1的调用f()无法返回了,线程1,线程2就是你等我,我等你,死掉了

这是死锁的一个模拟。
hcyang 2007-01-24
  • 打赏
  • 举报
回复
稍等,有几千行的代码,我整理一下,在这先谢谢各位了
尘雨 2007-01-24
  • 打赏
  • 举报
回复
b[0],b[1],b[2],b[3]分别启动4个线程(不同的线程)
现在的问题是
b[0],b[1],b[2],b[3]任何一个调用窗体类A中的函数f(),就导致程序无响应
其中f()中调用WaitForMultipleObjects等待键盘鼠标事件

怎么不是同时调用呢,你的等待键盘都在f()里面,肯定是线程先调用f()才等待键盘事件,并不是你刚说的先等待键盘,再调用f()

你的相关代码不贴出来,语言也描述不清楚的
vcnewer 2007-01-24
  • 打赏
  • 举报
回复
如果真是你上面说的话就不会有死锁,可能某些细节疏忽了,并不是你认为的那样,仔细的检查程序吧,或者把代码贴出来。
hcyang 2007-01-24
  • 打赏
  • 举报
回复
b[0],b[1],b[2],b[3]中的线程不是同时调用f()的,键盘按下F1,F2,F3,F4时,对应的b[]才会调用f(),现在是只要有一个b[]调用了f()。程序就死掉
如果是死锁,那么死锁的原因是什么
qhgary 2007-01-24
  • 打赏
  • 举报
回复
你也说了之前单线程,单线程怎么死锁啊?多线程了才会互相等待导致死锁啊.
hcyang 2007-01-24
  • 打赏
  • 举报
回复
可是之前单线程为什么没有问题
之前的情况是:
oninitdialog()启动线程,此线程调用f(),f()函数同样WaitForMultipleObjects()等待,没有问题
尘雨 2007-01-24
  • 打赏
  • 举报
回复
堵塞导致,每个调用f()的线程都挂起了了。最好是设置超时时间
尘雨 2007-01-24
  • 打赏
  • 举报
回复
WaitForMultipleObjects()这里导致堵塞
你把代码贴出来
尘雨 2007-01-24
  • 打赏
  • 举报
回复
你把 WaitForMultipleObjects(...);写全

15,471

社区成员

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

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