线程中使用到全局变量g_Mainframe 出现死锁现象。

zhu6789888 2010-07-20 09:51:55
我的程序CMainFrame 中 有
extern CMainFrame* g_Mainframe;//因为要在view中使用,所以定义了个全局变量

CMainFrame::CMainFrame()
{
g_Mainframe = this;
}

DWORD WINAPI ThreadFun(LPVOID lpParam)
{
for(int i =0; i < 100; i++)
{
g_Mainframe->Fun1();
g_View->Fun2();//更新界面 g_View 和g_Mainframe 类似
}
}

执行这个线程的时候,有时候会出现死锁的现象,不是每次都出现,请问要怎么处理呢?
...全文
120 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdsnpeter 2010-07-22
  • 打赏
  • 举报
回复
可以AfxGetApp()->GetMainWnd()得到MainFrame。
更新界面,需要SendMessage或者PostMessage,发自定义消息,在消息函数中调用你的fun1,Fun2即可。
嗨客递锅 2010-07-22
  • 打赏
  • 举报
回复
不需要用全局的吧? 在Mainframe里自定义个消息,然后你在线程里POSTMESSAGE给主窗口句柄。
Mainframe 响应消息,根据不同的参数处理不同的函数,这样不会死锁。
是在Mainframe里自定义消息,这个。。。。。。会吧?

用POSTMESSAGE。万不得已,需要及时返回的功能才用SEND。
zhu6789888 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qinwei 的回复:]

[1]不能再同一线程中使用,不然会有冲突
[2]考虑用Event,WaitForMultipleObjects 同步 两线程,
[/Quote]

能具体点马 ?

[Quote=引用 10 楼 visualeleven 的回复:]

线程里PostMessage消息到主界面上去处理
[/Quote]
PostMessage 什么消息呢 ?
zhu6789888 2010-07-22
  • 打赏
  • 举报
回复
g_Mainframe 又不是特地 为了线程定义的,只是线程刚刚好用到

g_Mainframe 是为了方便在view使用。

而这个线程是写的试图中的。不是CMainFrame里面 。

(自定义消息我知道 )。
zhu6789888 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wangningyu 的回复:]

真不明白为啥要用全局变量,而弃线程函数的参数不用...
[/Quote]view 里面好用阿 ,不用每次去获取。

[Quote=引用 6 楼 xingworld 的回复:]

for(int i =0; i < 100; i++)
这个执行的太快了吧,加个 SLEEP 试试,让 CPU 有个切换和休息的时间。

C/C++ code

DWORD WINAPI ThreadFun(LPVOID lpParam)
{
for(int i =0; i < 100; i++)
{
g_Mainframe->Fun1();
Sleep(0);
g_……
[/Quote]

休息了反而更坏了,死锁概率更大了
Eleven 2010-07-21
  • 打赏
  • 举报
回复
线程里PostMessage消息到主界面上去处理
qinwei 2010-07-21
  • 打赏
  • 举报
回复
[1]不能再同一线程中使用,不然会有冲突
[2]考虑用Event,WaitForMultipleObjects 同步 两线程,
zhu6789888 2010-07-21
  • 打赏
  • 举报
回复
定上去 看看
chengtao999 2010-07-20
  • 打赏
  • 举报
回复
更新界面请用消息。

线程中去操作界面不是个好主意。
oyljerry 2010-07-20
  • 打赏
  • 举报
回复
Fun1和Fun2会不会互相死锁
xingworld 2010-07-20
  • 打赏
  • 举报
回复
for(int i =0; i < 100; i++)
这个执行的太快了吧,加个 SLEEP 试试,让 CPU 有个切换和休息的时间。


DWORD WINAPI ThreadFun(LPVOID lpParam)
{
for(int i =0; i < 100; i++)
{
g_Mainframe->Fun1();
Sleep(0);
g_View->Fun2();//更新界面 g_View 和g_Mainframe 类似
Sleep(100);//根据自己的情况而决定休息的时间
}
}

汪宁宇 2010-07-20
  • 打赏
  • 举报
回复
真不明白为啥要用全局变量,而弃线程函数的参数不用...
chengtao999 2010-07-20
  • 打赏
  • 举报
回复
在线程中postmessage或sendmessage,界面更新过程交给主线程去完成
zhu6789888 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chengtao999 的回复:]

更新界面请用消息。

线程中去操作界面不是个好主意。
[/Quote]
要怎么处理呢?不用线程 ,界面就假死了


[Quote=引用 1 楼 oyljerry 的回复:]

Fun1和Fun2会不会互相死锁
[/Quote]
不会,毫无关联

15,471

社区成员

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

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