程序有时运行出错有时却正常 怎么调试 一般是什么问题

Superaltman 2010-03-30 10:43:20
我是创建的vc2005 MFC对话框应用程序(我是创建2个线程来完成我的功能 并用内核对象同步),其实为欢乐豆记牌器。

程序的功能达到了,但有时程序没有死,但功能没了,且CPU占用50%。

我调试了n长时间了,但是实在是找不到哪错了 。

请高手教几招。



两个线程, 一个用FindWindows查找窗口,然后置位内核对象使第二个线程运行并用内核对象使自己挂起。
第2个线程用ReadProcessMemory读内存,当有错就用内核对象挂起自己,
并又用内核对象使第一个线程继续运行。总的来说就是不停查找窗口并读窗口主进程内存。
...全文
295 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
remi362411 2011-05-12
  • 打赏
  • 举报
回复
帮忙顶一个,我也有类似的问题,希望高手帮忙解答,我的程序少部分时候运行正常,大多数会卡死,卡死又分两种情况,一种是运行是卡死,另一种是程序关闭时死循环
Superaltman 2010-03-31
  • 打赏
  • 举报
回复
当欢乐斗地主退出时 程序会检查并自动运行
yekoufeng 2010-03-31
  • 打赏
  • 举报
回复
搞不明白你为啥要这么做
Superaltman 2010-03-30
  • 打赏
  • 举报
回复
CHack类的Threadlisten 查找斗地主窗口
CHack类的ThreadReadM 读斗地主主线程内存
Superaltman 2010-03-30
  • 打赏
  • 举报
回复
UINT CHack::ThreadListen(void* p)
{
CHack* pHack=(CHack*)p;
HWND hwDdz;
while(1) //线程死循环
{
::Sleep(100);

::WaitForSingleObject(pHack->m_hEventListen,INFINITE);//等待
::InvalidateRect(pHack->m_pDlg->m_hWnd,NULL,TRUE);
//寻找斗地主窗口
while(hwDdz = ::FindWindow(NULL,pHack->m_stRAMInf.pszCaption), hwDdz == NULL)
{
::Sleep(1000);
}
//打开斗地主进程
DWORD PID,TID;
TID = ::GetWindowThreadProcessId(hwDdz,&PID);
if(pHack->m_hddz != NULL)
{
::CloseHandle(pHack->m_hddz);
pHack->m_hddz=NULL;
}
pHack->m_hddz = ::OpenProcess(PROCESS_VM_READ|PROCESS_QUERY_INFORMATION ,TRUE,PID);
if(NULL == pHack->m_hddz)
{
EL("CHack::ThreadListen OpenProcess Error");
pHack->m_pDlg->EndDialog(0);
return 0;
}
//init内存指针地址
pHack->ReConstractor();
if(FALSE==pHack->InitMemory())
{
EL("CHack::ThreadListen InitMemory Error");
pHack->m_pDlg->EndDialog(0);
return 0;
}
if(0 == ::SetEvent(pHack->m_hEventRead)) //使读内存线程运行
{
EL("CHack:ThreadListen SetEvent(m_hEventRead) Error");
pHack->m_pDlg->EndDialog(0);
return 0;
}
if(0 == ::ResetEvent(pHack->m_hEventListen))
{
EL("CHack:ThreadListen ResetEvent(m_hEventListen) Error");
pHack->m_pDlg->EndDialog(0);
return 0;
}
}
EL("Error Can't run here");
return 1;
}

UINT CHack::ThreadReadM(void* p)
{
CHack* pHack=(CHack*)p;

while(1)
{
::Sleep(100);

::WaitForSingleObject(pHack->m_hEventRead,INFINITE);//等待
if(FALSE == pHack->ReadMemory())
{
Sleep(200);

memset( pHack->m_wUnsightCard,0,sizeof(pHack->m_wUnsightCard));
if(0 == ::ResetEvent(pHack->m_hEventRead))
{
EL("CHack:ThreadListen SetEvent(m_hEventRead) Error");
pHack->m_pDlg->EndDialog(0);
return 0;
}
if(0 == ::SetEvent(pHack->m_hEventListen))
{
EL("CHack:ThreadListen SetEvent(m_hEventRead) Error");
pHack->m_pDlg->EndDialog(0);
return 0;
}
continue;
}

if( pHack->m_dwDisCard[0][0] == 0 && pHack->m_dwDisCard[1][0] == 0 && pHack->m_dwDisCard[2][0] == 0 )
memset( pHack->m_wUnsightCard,0,sizeof(pHack->m_wUnsightCard));
if(FALSE == pHack->ShowPic())
{
EL("CHack::ThreadReadM ShowPic Error");
pHack->m_pDlg->EndDialog(0);
return 0;
}

}//while 死循环
}
newasoft 2010-03-30
  • 打赏
  • 举报
回复
概念讲完了,贴代码!
大家瞧瞧,找问题!

2,640

社区成员

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

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