多线程死锁问题求助

qq_15862675 2019-07-10 01:15:07
我创建了一个工作线程,在工作线程里面设置了一个timer定时器,负责根据数据定时刷新主对话框界面的列表,刷新前用guard_lock对一个全局mteux上锁,避免数据访问冲突,主界面的一些消息响应中也要对数据进行处理,所以处理前也要上锁。 现在出现的问题是如果主界面的消息响应反复上锁,程序会卡住没反应了,不知道是死锁还是怎么回事,比如在双击消息响应中上锁,如果连续反复双击一会儿就会卡死,或者连续删除数据,删除前上锁,有时候也会卡死,帮忙分析下什么问题
...全文
49 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_15862675 2019-07-10
  • 打赏
  • 举报
回复
好像找到原因了,工作线程在刷新主界面list的过程中,主线程进入等待状态以后,刷新函数setitemtext会被阻塞,子线程也进去等待状态,ui线程加锁,工作线程不能刷新Ui控件
sevancheng 2019-07-10
  • 打赏
  • 举报
回复
guard_lock 按理不会锁死,临时变量析构会自动解锁
qq_15862675 2019-07-10
  • 打赏
  • 举报
回复
引用 1 楼 Eleven的回复:
你可以这样试试:工作线程获取数据,填充一个自定义的结构体,然后PostMessage消息到UI线程,UI线程收到数据以后处理,处理完成以后通知工作线程执行下一次操作。

伪代码类似下面这样:
UINT __cdecl ThreadProc(...)
{
...
MSG msg;
while(!bExitThread && GetMessage(&msg, NULL, 0, 0, 0)
{
switch(msg.message)
{
case MSG_XXX:
{
// 执行计算,填充结构体数据,发送自定义消息通知UI线程。
}
}
}
...
}


LRESULT OnXXXXX(WPARAM, LPARAM) // UI线程的自定义消息处理函数
{
// 解析数据,更新UI信息
PostThreadMessage(...); // 通知线程执行下一次操作
}
刷新工作有时候时间比较长,所以我开了个工作线程负责刷新,避免主界面卡顿,不然就直接在Ui线程刷新了
Eleven 2019-07-10
  • 打赏
  • 举报
回复
你可以这样试试:工作线程获取数据,填充一个自定义的结构体,然后PostMessage消息到UI线程,UI线程收到数据以后处理,处理完成以后通知工作线程执行下一次操作。

伪代码类似下面这样:
UINT __cdecl ThreadProc(...)
{
...
MSG msg;
while(!bExitThread && GetMessage(&msg, NULL, 0, 0, 0)
{
switch(msg.message)
{
case MSG_XXX:
{
// 执行计算,填充结构体数据,发送自定义消息通知UI线程。
}
}
}
...
}


LRESULT OnXXXXX(WPARAM, LPARAM) // UI线程的自定义消息处理函数
{
// 解析数据,更新UI信息
PostThreadMessage(...); // 通知线程执行下一次操作
}

15,471

社区成员

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

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