社区
进程/线程/DLL
帖子详情
关于多线程,急!!
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
打赏
收藏
关于多线程,急!!
窗体类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()不可以被中断吗,之前单线程的时候没问题,换乘多线程就不行了
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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(...);写全
java 单线程改
多线程
_帮我把单线程的程序改成
多线程
JAVA,
急
!
/*SocketServer.java*/importjava.awt.*;importjava.awt.event.*;publicclassSocketServerextendsFrameimplementsActionListener{Labellabel=newLabel("输入聊天信息,按回车发送!");.../*SocketServer.java*/import...
多线程
(一):创建线程和线程的常用方法
一:为什么要学
多线程
应付面试 :
多线程
几乎是面试中必问的题,所以掌握一定的基础知识是必须的。 了解并发编程:实际工作中很少写
多线程
的代码,这部分代码一般都被人封装起来了,在业务中使用
多线程
的机会也...
多线程
四大经典案例及java
多线程
的实现
我们知道
多线程
编程,因为线程的随机调度会出现很
多线程
安全问题! 而我们的java有些大佬针对一些
多线程
安全问题的应用场景,设计了一些对应的解决方法和案例,就是解决这些问题的一些套路,被称为设计模式,供我们学习和...
多进程与
多线程
区别
在Unix上编程采用
多线程
还是多进程的争执由来已久,这种争执最常见到在C/S通讯中服务端并发技术 的选型上,比如WEB服务器技术中,Apache是采用多进程的(perfork模式,每客户连接对应一个进程,每进程中只存在唯一一...
多线程
Future模式使用
一个业务方法可能执行时间很长,而我们也不
急
着摇返回结果,那么就可以用
多线程
去开启一个子线程执行这个业务方法,同时,子线程可以返回这个业务方法的返回结果,那这是什么模式呢? 二、关于Future 1.什么是Future...
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章