VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 397|回复: 4

[求助] 这是孙鑫关于CreateEvent多线程例子,是从孙鑫附件中下载来,为啥还会出错呢?

[复制链接]
cumulonimbus 发表于 2016-3-15 14:21:11 | 显示全部楼层 |阅读模式

3驿站币
本帖最后由 cumulonimbus 于 2016-3-15 14:23 编辑

这是孙鑫关于CreateEvent多线程例子(这是孙鑫第16课的授课的课程),是从孙鑫附件中下载来,一个字没改,运行后为啥还会出错呢?难道孙鑫不懂C++?太困惑了,弄得我学习不下去了。


代码不起作用了,执行了一个线程会跑到另一个线程去。


代码如下,一字未改:
#include <windows.h>
#include <iostream.h>

DWORD WINAPI Fun1Proc(
  LPVOID lpParameter   // thread data
);

DWORD WINAPI Fun2Proc(
  LPVOID lpParameter   // thread data
);

int tickets=100;
HANDLE g_hEvent;

void main()
{
        HANDLE hThread1;
        HANDLE hThread2;
        hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
        hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
        CloseHandle(hThread1);
        CloseHandle(hThread2);

        //g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
        g_hEvent=CreateEvent(NULL,FALSE,FALSE,"tickets");
        if(g_hEvent)
        {
                if(ERROR_ALREADY_EXISTS==GetLastError())
                {
                        cout<<"only instance can run!"<<endl;
                        return;
                }
        }
        SetEvent(g_hEvent);

        Sleep(4000);
        CloseHandle(g_hEvent);
}

DWORD WINAPI Fun1Proc(
  LPVOID lpParameter   // thread data
)
{
        while(TRUE)
        {
                WaitForSingleObject(g_hEvent,INFINITE);
//                ResetEvent(g_hEvent);
                if(tickets>0)
                {
                        Sleep(1);
                        cout<<"thread1 sell ticket : "<<tickets--<<endl;
                }
                else
                        break;
                SetEvent(g_hEvent);
        }
       
        return 0;
}

DWORD WINAPI Fun2Proc(
  LPVOID lpParameter   // thread data
)
{
       
        while(TRUE)
        {
                WaitForSingleObject(g_hEvent,INFINITE);
//                ResetEvent(g_hEvent);
                if(tickets>0)
                {
                        Sleep(1);
                        cout<<"thread2 sell ticket : "<<tickets--<<endl;
                }
                else
                        break;
                SetEvent(g_hEvent);
        }
       
        return 0;
}

附件: 您需要 登录 才可以下载或查看,没有帐号?加入驿站

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

runfog 发表于 2016-3-15 14:30:29 | 显示全部楼层
孙鑫关于CreateEvent多线程例子

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

Syc 发表于 2016-3-15 16:16:38 | 显示全部楼层
应该在 CreateThread 之前 CreateEvent 吧?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

 楼主| cumulonimbus 发表于 2016-3-16 12:27:02 | 显示全部楼层
Syc 发表于 2016-3-15 16:16
应该在 CreateThread 之前 CreateEvent 吧?

这可是孙鑫的原版代码,我没改过一个字。为啥我把CreateEvent放在CreateThread之前就不会出错呢?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

Syc 发表于 2016-3-16 13:07:30 | 显示全部楼层
cumulonimbus 发表于 2016-3-16 12:27
这可是孙鑫的原版代码,我没改过一个字。为啥我把CreateEvent放在CreateThread之前就不会出错呢?

他可能是以错误实例来讲解的吧
线程是异步的,你要是用Event来同步,所以必须在创建线程之前就把事件先创建出来喽

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号

返回顶部
x

VC驿站微信公众号cctry2009

GMT+8, 2017-3-25 21:26

Powered by Discuz! X3.3

© 2009-2017 cctry.com

快速回复 返回顶部 返回列表