线程锁定了怎么还能运行?

绿豆蛙2013 2008-10-17 03:56:53
好奇怪,我明明把这个线程锁定了,但是还是跳出来“123”,大家看看是怎么回事?
CEvent eventExcel;

CNetWatcherViewerDoc::CNetWatcherViewerDoc()
{
CWinThread *m_pExcelThread=AfxBeginThread(ConstructExcel,this);
if(m_pExcelThread==NULL){
AfxMessageBox("创建Excel文件失败!");
}
eventExcel.Lock();
}


UINT	ConstructExcel(LPVOID pParam)
{
::AfxMessageBox("123");
return 0;
}
...全文
144 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yifanfeng0913 2008-10-19
  • 打赏
  • 举报
回复
eventExcel.Lock();只是锁住了主线程,但ConstructExcel已经远行;后两个进程根本没有启动
hityct1 2008-10-19
  • 打赏
  • 举报
回复

CWinThread *m_pExcelThread=AfxBeginThread(ConstructExcel,this);
if(m_pExcelThread==NULL){
AfxMessageBox("创建Excel文件失败!");
}

eventExcel.Lock();

可以用“异步”理解:AfxBeginThread是立即返回的,所以有两种可能情况,
1)当执行到eventExcel.Lock();时,线程已经运行或运行完毕。
2) 当执行到eventExcel.Lock();时,线程没有运行。

再说,Lock是锁定临界区代码的,限制多个线程同时访问一个数据。
阿呆_ 2008-10-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lzh19840809 的回复:]
C/C++ codeeventExcel.Lock();

这不是锁线程吗?
[/Quote]

这个不是锁线程,只是重置codeeventExcel事件. 如果有线程等待这个事件的话会被锁住.
但是没有看到你有任何代码将你的线程和这个codeeventExcel关联起来
arong1234 2008-10-19
  • 打赏
  • 举报
回复
你如果想用eventExcel锁住子线程的话,几个条件必须满足
1. eventExcel.Lock必须在AfxBeginThread之前调用,因为线程一旦创建就会立刻运行,可能在你想锁它的时候,线程已经执行完了
2. 在子线程内必须也来获得这个锁。否则你在主线程里上个锁,凭什么去影响子线程那?

[Quote=引用楼主 lzh19840809 的帖子:]
好奇怪,我明明把这个线程锁定了,但是还是跳出来“123”,大家看看是怎么回事?

C/C++ codeCEvent eventExcel;



C/C++ codeCNetWatcherViewerDoc::CNetWatcherViewerDoc()
{
CWinThread *m_pExcelThread=AfxBeginThread(ConstructExcel,this);
if(m_pExcelThread==NULL){
AfxMessageBox("创建Excel文件失败!");
}
eventExcel.Lock();
}




C/C++ codeUINT ConstructExc…
[/Quote]
绿豆蛙2013 2008-10-18
  • 打赏
  • 举报
回复
我经过调试发现,
CWinThread *m_pExcelThread=AfxBeginThread(ConstructExcel,this);
if(m_pExcelThread==NULL){
AfxMessageBox("创建Excel文件失败!");
}

eventExcel.Lock();

CWinThread *m_pStoreThread=AfxBeginThread(Storedata,this);
if(m_pStoreThread==NULL){
AfxMessageBox("保存失败!");
}
//::WaitForSingleObject(eventStore.m_hObject,0);//等待接收线程

// start sub recv thread
eventStore.Lock();

m_pRecvThread=AfxBeginThread(Recvdata,this);
if(m_pRecvThread==NULL){
AfxMessageBox("监听失败!");
}
eventReceive.Lock();

这三个线程哪个放在最前面就不能锁定,到底是怎么回事呢?请高手来解释一下,谢谢
绿豆蛙2013 2008-10-18
  • 打赏
  • 举报
回复
不知道为什么,我设了三个线程,只有这一个不能锁定,其他的两个都可以锁定,我把三个线程都锁定,这个线程照样运行。是不是这个默认的是主线程呢?
绿豆蛙2013 2008-10-18
  • 打赏
  • 举报
回复
eventExcel.Lock(); 

这不是锁线程吗?
WinEggDrop 2008-10-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 lzh19840809 的帖子:]
好奇怪,我明明把这个线程锁定了,但是还是跳出来“123”,大家看看是怎么回事?

C/C++ codeCEvent eventExcel;



C/C++ codeCNetWatcherViewerDoc::CNetWatcherViewerDoc()
{
CWinThread *m_pExcelThread=AfxBeginThread(ConstructExcel,this);
if(m_pExcelThread==NULL){
AfxMessageBox("创建Excel文件失败!");
}
eventExcel.Lock();
}





C/C++ codeUINT ConstructExc…
[/Quote]

没看到任何"锁"线程代码
microyzy 2008-10-17
  • 打赏
  • 举报
回复
我没用过CEvent
但是看代码,好像没什么东西能阻止AfxMessageBox("123");,它是在子线程里运行的,你lock的是主线程?

15,466

社区成员

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

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