beginthread的线程函数不执行

CaryChen 2009-10-10 04:04:22
线程函数RunModule里面程序不执行,各位提供点问题的可能原因,谢谢

void RunModule(LPVOID lpParam)
{
SHELLEXECUTEINFO* pseinfo = (SHELLEXECUTEINFO*)lpParam;
if (NULL == pseinfo)
return ;

HWND hWnd =::FindWindow(NULL, pseinfo->lpParameters);

if (NULL == hWnd)
::ShellExecuteEx(pseinfo);
if (pseinfo->hProcess)
::WaitForSingleObject(pseinfo->hProcess, INFINITE);

...
}

void CInfoManager::RunTKBModule(LPCTSTR lpszFilePath, LPCTSTR lpszWnidowTitle, HWND *phWnd)
{
ASSERT(lpszFilePath != NULL);
ASSERT(AfxIsValidString(lpszFilePath));
ASSERT(lpszWnidowTitle != NULL);
ASSERT(AfxIsValidString(lpszWnidowTitle));

HWND hWnd = ::FindWindow(NULL, lpszWnidowTitle);
SHELLEXECUTEINFO seinfo;
seinfo.hwnd = NULL;
seinfo.fMask = SEE_MASK_NOCLOSEPROCESS;
seinfo.lpVerb = _T("Open");
seinfo.lpFile = lpszFilePath;
seinfo.nShow = SW_SHOW;
seinfo.lpParameters = lpszWnidowTitle;
seinfo.cbSize = sizeof(seinfo);
_beginthread(RunModule, 0, (LPVOID)&seinfo);
Sleep(1000);

while (NULL == hWnd && phWnd)
{//这里死循环
Sleep(0);
hWnd = ::FindWindow(NULL, lpszWnidowTitle);
}
if (phWnd)
*phWnd = hWnd;
}
...全文
397 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
CaryChen 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 a1erx 的回复:]
你的线程函数也没啥东西,一句没执行?你确定HWND hWnd = ::FindWindow(NULL, lpszWnidowTitle);
找到想要窗口了?连判断都不做么?OutDebugString看看执行到哪了!
[/Quote]
这个目的就是找窗口,如果没启动就用线程去启动,然后下面循环判断,等待线程启动。
这里就死循环了
CaryChen 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ghost90 的回复:]
改下编译器设置试试

Configuration Properties->C/C++->Code Generation
的 Runtime Library 选 Multi-threaded DLL(/MD)
[/Quote]
已经你是说的这个设置了
CaryChen 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ghost90 的回复:]
错了,_beginthread 不是宏,是个函数,
_beginthread(RunModule, 0, NULL);
试试,如果还不行,晚上回去看下书再回。

[/Quote]
不能NULL要传参数的
Ghost90 2009-10-13
  • 打赏
  • 举报
回复
改下编译器设置试试

Configuration Properties->C/C++->Code Generation
的 Runtime Library 选 Multi-threaded DLL(/MD)
Ghost90 2009-10-13
  • 打赏
  • 举报
回复
错了,_beginthread 不是宏,是个函数,
_beginthread(RunModule, 0, NULL);
试试,如果还不行,晚上回去看下书再回。
A1erX 2009-10-13
  • 打赏
  • 举报
回复
你的线程函数也没啥东西,一句没执行?你确定HWND hWnd = ::FindWindow(NULL, lpszWnidowTitle);
找到想要窗口了?连判断都不做么?OutDebugString看看执行到哪了!
CaryChen 2009-10-13
  • 打赏
  • 举报
回复
以上各位讲的都尝试过了,返回是大于0的值,RunModule里一句都不执行。
设置断点的方式不可行,根本进不去

_beginthread这类的方法都尝试遍了。
zpf82118 2009-10-12
  • 打赏
  • 举报
回复
就是啊
还不确定线程是否执行了
Ghost90 2009-10-12
  • 打赏
  • 举报
回复
_beginthread 宏在 2003 里和 2008里定义的不一样 设个断点跟进去看下就知道了
wocow3 2009-10-12
  • 打赏
  • 举报
回复
RunModule里设个断点,看是否真的不执行?
_beginthread不推荐使用唯一原因是线程函数有可能结束太快造成返回的现线程句柄已经释放而变成野句柄,这里应该不是这个原因
feilinhe 2009-10-12
  • 打赏
  • 举报
回复
_beginthread已经不被推荐使用了,使用_beginthreadex代替下试试
zoulie 2009-10-10
  • 打赏
  • 举报
回复
看下返回值,或者换成CreateThread试下
oyljerry 2009-10-10
  • 打赏
  • 举报
回复
RunModule 线程函数中增加一些log输出等,看是否调用
xylicon 2009-10-10
  • 打赏
  • 举报
回复
查看一下_beginthreadex 的返回值,看线程是否创建成功。
CaryChen 2009-10-10
  • 打赏
  • 举报
回复
这个程序原来是VS2003的,现在用VS2008升级的,这部分的程序没有动过,VS2003的时候正常的

15,471

社区成员

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

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