VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1104|回复: 5

弱问一个主线程和辅线程同步问题

[复制链接]

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-12-17 12:30:02 | 显示全部楼层 |阅读模式
在辅线程中发消息给主线程,主线程处理完了该消息,将一个全局时间置成信号态,在辅线程的Run()中用WaitForSingleObject(该事件,INFINITE)阻塞等待该事件置成信号态却老等不到,为什么?谢谢Assert出现在CMapPtrToPrt()
代码如下:
代码是:
    CDrawThread::Run()
    {
        ::PostMessage(m_pOwner->GetSafeHwnd(),WM_GETDATA,0,0L);
        ::WaitForSingleObject(g_evDone,INFINITE);
        TRACE() //该TRACE没有被执行.
    }
    CWaveView::OnGetData() // WM_GETDATA
    {
        CDoc *pDoc = (CDoc*)GetDocument();
        pDoc->... // do sth
        g_evDone->SetEvent();
        TRACE() //该TRACE执行完了
    }

Debug output:
    执行完第二个TRACE那里就出现ARRSRT了

回复

使用道具 举报

2

主题

16

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-12-18 17:15:01 | 显示全部楼层
MFC objects are thread specifical, you need to do Detach/Attach, Attaching and Detaching Objects
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-12-19 16:00:01 | 显示全部楼层
已经有
CView* m_pOwner = NULL;
m_pOwner->FromHandle(hOwner);
也不行,前辈你说的是这个意思么?
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-12-19 20:30:01 | 显示全部楼层
这段代码好像没问题啊!!!
你将消息处理成功,但事件又等不到,然后你又说出现个Assert错误。。。。。
这说明你的消息肯定没成功啊。OnGetData有问题
回复

使用道具 举报

0

主题

10

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-12-20 00:45:01 | 显示全部楼层
我来猜测一下,纯属猜测啊,呵呵,顶顶人气!

是不是g_evDone->SetEvent();之后,工作线程接着运行,要TRACE(),但是,在OnGetData() 里面,SetEvent();执行完毕之后,同样要TRACE(),会不会是这两个TRACE()冲突了啊?
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-12-20 07:45:01 | 显示全部楼层
是我的错我没有说清楚,在OnGetData()里面的TRACE是执行过的,在执行了这个TRACE理论上是应该再执行WaitForSingleObject()后面的TRACE但是没有,程序debug跳出个assert来,现场的call stack如下:
CMapPtrToPtr::GetValueAt(void * 0x002602de) line 186 + 9 bytes
CHandleMap::LookupPermanent(void * 0x002602de) line 90 + 19 bytes
CWnd::AssertValid() line 894 + 15 bytes
CView::AssertValid() line 495
CFormView::AssertValid() line 278
CEcmRecordView::AssertValid() line 62
AfxAssertValidObject(const CObject * 0x003d63a0 {CEcmRecordView}, const char
* 0x5f4d1700 THIS_FILE, int 939) line 108
CDocument::AssertValid() line 940
CEcmUIDoc::AssertValid() line 109
AfxAssertValidObject(const CObject * 0x003d5d88 {CEcmUIDoc}, const char * 0x
5f4d1744 THIS_FILE, int 425) line 108
CDocTemplate::AssertValid() line 426
CMultiDocTemplate::AssertValid() line 220
AfxAssertValidObject(const CObject * 0x003d4a38 {CMultiDocTemplate}, const c
har * 0x5f4d17e0 THIS_FILE, int 852) line 108
CDocManager::AssertValid() line 853
AfxAssertValidObject(const CObject * 0x003d4b98 {CDocManager}, const char *
0x5f4d1a38 THIS_FILE, int 551) line 108
CWinApp::AssertValid() line 552
AfxAssertValidObject(const CObject * 0x00424978 class CEcmUIApp theApp, cons
t char * 0x5f4d19e8 THIS_FILE, int 537) line 108
CWinThread::OnIdle(long 0) line 541
CWinApp::OnIdle(long 0) line 479
CWinThread::Run() line 479 + 30 bytes
CWinApp::Run() line 400
AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x0014
1efa, int 1) line 49 + 11 bytes
WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141ef
a, int 1) line 30
WinMainCRTStartup() line 330 + 54 bytes
KERNEL32! 7c816fd7()
上面是call stack中的提示,下面是CMapPtrToPtr()的代码和出错的地方:
void* CMapPtrToPtr::GetValueAt(void* key) const
// find value (or return NULL -- NULL values not different as a result)
{
    if (m_pHashTable == NULL)
        return NULL;
    UINT nHash = HashKey(key) % m_nHashTableSize;
    // see if it exists
    CAssoc* pAssoc;
    for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext)
    // assert here
    {
        if (pAssoc->key == key)
            return pAssoc->value;
     }
    return NULL;
}
谢谢大家的关注,帮我想想吧,集思广意
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表