如果需要清理另一个线程中的所有内容,如何在winapi中使用关闭处理程序?

时间:2019-03-31 21:43:05

标签: c multithreading winapi

我正在为我的游戏创建线程。但是我发现,如果按下关闭按钮,或者任务被终止,我将无法正常完成工作,从而无法在程序中分配所有我需要的资源。

我发现存在Close处理程序,但是给出的示例对我来说是一个未知的魔术,因为我需要在ANSI-C中创建类似的东西。

class YourClassName extends Component {
  constructor(props) {
    super(props);
  }

  componentDidMount() {

  }

  componentDidUpdate() {

  }

  render() {
    const { classes } = props;

    return (
    <div className={classes.root}>
      <Grid container spacing={24}>
        <Grid item xs={12} sm={6}>
          <Paper className={classes.paper}><Swappable id='1' content={<DataTable/>}/></Paper>
        </Grid>
        <Grid item xs={12} sm={6}>
          <Paper className={classes.paper}> <Swappable id='2' content="#2"/></Paper>
        </Grid>
        <Grid item xs={12} sm={6}>
          <Paper className={classes.paper}><Swappable id='3' content="#3"/></Paper>
        </Grid>
        <Grid item xs={12} sm={6}>
          <Paper className={classes.paper}><Swappable id='4' content="#4"/></Paper>
        </Grid>
      </Grid>
    </div>
    );
  }
}

const mapStateToProps = state => {
  return {
    something: state.something,
    something2: state.something2,
  };
}

const YourClassNameContainer = connect(mapStateToProps)(YourClassName);

export default YourClassNameContainer;

我知道Winapi具有Mutex和条件变量,但是我对std :: atomic等效项一无所知。

我有这个线程启动函数和内部线程函数GameThread,我现在检查了一个常规的bool变量m_bAtomActive。

   static BOOL CloseHandler(DWORD evt)
    {
        if (evt == CTRL_CLOSE_EVENT)
        {
            m_bAtomActive = false;

            // Wait for thread to be exited
            std::unique_lock<std::mutex> ul(m_muxGame);
            m_cvGameFinished.wait(ul);
        }
        return true;
    }

我不擅长线程,如何正确完成游戏工作?

所有其他详细信息将在评论或聊天中提供。

UPD:第一件事情似乎很简单,在关闭处理程序中使用此行即可解决

void Start(void* _self)
{
    DWORD dwThreadID;
    HANDLE hThread;

    struct c_class* this = _self;
    this->m_bAtomActive = true;

    hThread = CreateThread(
        NULL,
        0,
        &GameThread,
        _self,
        0,
        &dwThreadID);

    WaitForSingleObject(hThread, INFINITE);
}

但是第二和第三仍在质疑中。创建它们的原因可能是因为CloseHandler在销毁应用程序之前将其杀死,但我不确定。

0 个答案:

没有答案