多线程编程的基本问题,以分示谢

master_ttch 2004-10-13 02:54:07
思路:
1.在主线程A中创建子线程B
2.子线程B完成的功能就是调用一特定的网络api函数:如gethostbyname()(该函数在网络没有连通的情况下有可能会很长时间没有响应,特别是win98下也许1分钟都没有响应)
3.主线程在创建子线程B后会循环判断,如果子线程在10秒内没有回应,强行kill掉子线程

我的代码如下:
主线程内:

m_hThreadWait = AfxBeginThread(MyThreadFunc, this, THREAD_PRIORITY_NORMAL)->m_hThread;

//检查10s,如果10s后仍没有反应,kill
for(int i=0; i<10;i++)
{
if(m_bFlag)//m_bFlag初始化为FALSE,在子线程中设置为TRUE
break;
Sleep(1000);
}

TerminateThread(m_hThreadWait, 0xffffffff);


子线程内:

函数MyThreadFunc
{
HOSTENT* remoteHostent = gethostbyname(host);
if (remoteHostent )
{
m_bFlag == TRUE;//设置标志

}
}


运行后有如下问题:
主线程是在OnTimer中定时调用的这段代码,第一次主线程会创建子线程成功,并进入在子线程的MyThreadFunc函数,但是从第二次以后就再也进不去子线程函数了,通过debug,发现OnTimer每次定时调用后,m_hThreadWait都会产生新值,也就是子线程产生成功,但是为什么就进入不了子线程?
...全文
117 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
master_ttch 2004-10-13
  • 打赏
  • 举报
回复
多谢。先给100感谢。
感激不尽,你到1颗红星还差多少分,我开贴给你。
huwei001982 2004-10-13
  • 打赏
  • 举报
回复
YES, 就是这样

执行到 return 语句后, 线程将自行销毀
master_ttch 2004-10-13
  • 打赏
  • 举报
回复
浪子兄?
master_ttch 2004-10-13
  • 打赏
  • 举报
回复
你的意思是这样吗
MyThreadFunc
{
......

return 0;//这儿加上return ,以便子线程自行退出,是吗?
}
huwei001982 2004-10-13
  • 打赏
  • 举报
回复
不会内存泄露

但是你的子线程中要加上 return 语句
master_ttch 2004-10-13
  • 打赏
  • 举报
回复
目前的问题是,在OnTimer第二次执行这个步骤时,子线程函数进不去。
而且我还担心,这样不停的创建子线程,是否会内存泄漏。
浪子,你的经验肯定比我多,帮我出出主意
huwei001982 2004-10-13
  • 打赏
  • 举报
回复
明白了

用我刚才给的代码就行啊
master_ttch 2004-10-13
  • 打赏
  • 举报
回复
to huwei001982(編程浪子),谢谢你帮我看这个问题,
也许我的思路没有表达清除,我现在开发一个上网程序,但是需要实时判断是否连接在网上,如果网络一中断,我的程序必须立刻得知当前最新的网络连接状态。没有别的好方法,只有采用笨方法,我就采用网络api函数gethostbyname来定时访问网络上某一特定主机,就好比ping命令一样。如果超时,那肯定网络中断了。
因此,我的子线程B就是实现这个功能。
主程序就在OnTimer函数里每隔一定时间来创建子线程,判断网络状态,杀掉子线程。
huwei001982 2004-10-13
  • 打赏
  • 举报
回复
你定时调用的话, 不是每次都产生一个新的 线程了吗
master_ttch 2004-10-13
  • 打赏
  • 举报
回复
to sinall() ,我的问题不是线程之间的信息传递,我的这个程序不涉及到这方面的问题,因为
主线程只是取m_bFlag 的值,不做改变,只有子线程B根据调用api函数后根据返回情况才改变这个值。
现在的问题关键在于好像我的多线程的步骤好像有问题,但是我不知道错在哪里,哪位兄台帮我看看
huwei001982 2004-10-13
  • 打赏
  • 举报
回复
没明白什么叫 从 OnTimer中调用这段代码

不需要用 定时器

辅助线程不变

主线程改
m_hThreadWait = AfxBeginThread(MyThreadFunc, this, THREAD_PRIORITY_NORMAL)->m_hThread;

//检查10s,如果10s后仍没有反应,kill
for(int i=0; i<10;i++)
{
if(m_bFlag)//m_bFlag初始化为FALSE,在子线程中设置为TRUE
break;
Sleep(1000);
}
if (!m_bFlag)
TerminateThread(m_hThreadWait, 0xffffffff);
sinall 2004-10-13
  • 打赏
  • 举报
回复
用信号量吧,自定义变量可能会有问题。
master_ttch 2004-10-13
  • 打赏
  • 举报
回复
请各位兄台多多帮助

15,471

社区成员

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

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