neoGFX
Cross-platform C++ app/game engine
async_thread.hpp
Go to the documentation of this file.
1 // async_thread.hpp
2 /*
3  * Copyright (c) 2020 Leigh Johnston.
4  *
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are
9  * met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  *
14  * * Redistributions in binary form must reproduce the above copyright
15  * notice, this list of conditions and the following disclaimer in the
16  * documentation and/or other materials provided with the distribution.
17  *
18  * * Neither the name of Leigh Johnston nor the names of any
19  * other contributors to this software may be used to endorse or
20  * promote products derived from this software without specific prior
21  * written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
24  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
25  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
27  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 
36 #pragma once
37 
38 #include <neolib/neolib.hpp>
39 #include <neolib/thread.hpp>
40 #include <neolib/async_task.hpp>
41 #include <neolib/event.hpp>
42 
43 namespace neolib
44 {
45  class async_event_queue;
46 
47  class async_thread : public thread
48  {
49  // types
50  private:
51  struct queue_ref
52  {
54  destroyed_flag queueDestroyed;
55 
56  queue_ref(async_event_queue& queue) :
57  queue{ queue },
58  queueDestroyed{ queue }
59  {}
60  };
61  // construction
62  public:
63  async_thread(async_task& aTask, const std::string& aName = "", bool aAttachToCurrentThread = false);
64  ~async_thread();
65  // implemenation
66  protected:
67  void exec_preamble() override;
68  void exec(yield_type aYieldType = yield_type::NoYield) override;
69  private:
70  async_task& iTask;
71  std::optional<queue_ref> iEventQueue;
72  };
73 }
yield_type
Definition: i_thread.hpp:42
async_thread(async_task &aTask, const std::string &aName="", bool aAttachToCurrentThread=false)
std::vector< operation > queue
void exec_preamble() override
void exec(yield_type aYieldType=yield_type::NoYield) override