首页
社区
课程
招聘
一段模拟子线程工作的代码的疑问[求助]
发表于: 2006-4-9 16:38 7058

一段模拟子线程工作的代码的疑问[求助]

2006-4-9 16:38
7058

#include <stdio.h>
#include <windows.h>
#include <process.h>
#include <iostream.h>

HANDLE g_hEvent;
DWORD WINAPI ChildFunc(LPVOID);

int main(int argc, char* argv[])
{
        HANDLE hChildThread;
        DWORD uId;
        char a;
       

        // 创建一个自动重置的(auto-reset events),未受信的(nonsignaled)事件内核对象
        g_hEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);

        hChildThread = ::CreateThread(NULL, 0, ChildFunc, NULL, 0, &uId);

        // 通知子线程开始工作
        cout << "请输入一个字符,通知子线程开始工作: \n";
        cin >> a;
        ::SetEvent(g_hEvent);

        // 等待子线程完成工作,释放资源
        ::WaitForSingleObject(hChildThread, INFINITE);
        cout <<"所有的工作都已完成. \n";
        ::CloseHandle(hChildThread);
        ::CloseHandle(g_hEvent);
        return 0;
}

DWORD WINAPI ChildFunc(LPVOID)
{
        ::WaitForSingleObject(g_hEvent, INFINITE);
        cout <<"子线程开始工作...... \n";
        ::Sleep(5*1000); // 暂停5秒,模拟真正的工作
        return 0;
}

上述代码是模拟子线程工作的。但在编译后运行输入一个字符,却将“子线程开始工作。。。。。”和“所有工作都已完成。”同时显示出来了,暂停5秒不起作用。请哪位兄弟指教一下,问题在哪?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 242
活跃值: (135)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
正常
vs2005
2006-4-9 19:52
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
3
你的代码只能实现让ChildFun线程sleep.
但并不能让主线程等待.

改成这样就可以了(伪码,需要添加相应的参数)

main()
{
.....
ResetEvent ( hEvent ) ;
CreateThread ( .... ) ;
WaitForSingleObject ( hEvent, .... ) ;
......
return 0 ;
}

DWORD WINAPI ChildFun ( ....)
{
    Sleep ( 5 * 1000 ) ;
    SetEvent ( hEvent ) ;
    return 0 ;
}
2006-4-9 20:43
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
4
最初由 北极星2003 发布
你的代码只能实现让ChildFun线程sleep.
但并不能让主线程等待.

改成这样就可以了(伪码,需要添加相应的参数)

........


这样不行啊!我的目的是由主线程通知子线程开始运行,然后子线程完成任务后再通知主线程结束。
2006-4-9 20:51
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
创建的时候先挂起他就可以了...

HANDLE hThread = CreateThread(NULL, 0, ChildFunc, NULL, CREATE_SUSPENDED, &uId);
....
//当要开始的时候
ResumeThread(hThread);
2006-4-9 22:12
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
问题已经解决了,结论如下:
  在子线程中,你是用cout <<"子线程开始工作...... \n";
  进行输出的,只要改成:
    cout<<"子线程开始工作..."<<endl; 或  
    printf("子线程开始工作...!\n");
  都可以正常工作。
  什么原因我也不知道,突然间问题就没了
2006-4-9 23:32
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
7
最初由 thinkSJ 发布
问题已经解决了,结论如下:
在子线程中,你是用cout <<"子线程开始工作...... \n";
进行输出的,只要改成:
cout<<"子线程开始工作..."<<endl; 或
printf("子线程开始工作...!\n");
........


确实是这样!感谢了。但又发现一个问题,就是在VC++60中调试时,程序运行后提示“所有工作已完成”,接着控制台提示“Press any key to continue”,按任意键后控制台退出,说明运行正常。如果直接双击运行程序则提示“子线程开始工作。。。。”5秒后自动退出,主线程的“所有工作已完成”显示不出来。这又是什么原因呢?
2006-4-10 08:14
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
8
C++的库有单线程库和多线程库之分的,不知楼主的情况是否和这有关
2006-4-10 11:06
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
9
我已经注意到这个问题的,在编译前设置成多线程DLL。
2006-4-10 11:26
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
10
猜想VS6.0的库是有Bug的
以前我就碰到过VS6.0的库有内存泄漏的问题
2006-4-10 12:49
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
11
所有的控制台程序都有这个问题据我所知的解决方法是
如果是C语言,在最后加上一个getchr()即可,
如果是C++则加上cin>> 变量名
2006-4-10 12:54
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
12
最初由 csjwaman 发布
确实是这样!感谢了。但又发现一个问题,就是在VC++60中调试时,程序运行后提示“所有工作已完成”,接着控制台提示“Press any key to continue”,按任意键后控制台退出,说明运行正常。如果直接双击运行程序则提示“子线程开始工作。。。。”5秒后自动退出,主线程的“所有工作已完成”显示不出来。这又是什么原因呢?


实际上已经显示了,只不过进程立即结束了,太快,看不清楚罢了
只需要在main 函数return 之前加入“cin >> a ;”
这样就可以见到效果
目的只是在进程结束之前暂停下
我曾经看到过一个暂停的函数,现在想不起来了
还是这个老土的办法
2006-4-10 12:58
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
13
谢谢各位指教!
2006-4-10 13:10
0
雪    币: 270
活跃值: (176)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
14
return前加个:
system("pause");
2006-4-10 15:04
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
15
最初由 ikki 发布
return前加个:
system("pause");


就是这个
2006-4-10 19:10
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
16
多谢各位了!
2006-4-11 09:15
0
游客
登录 | 注册 方可回帖
返回
//