-
Notifications
You must be signed in to change notification settings - Fork 61
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
2c35d5f
commit dfc468a
Showing
7 changed files
with
117 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,4 +15,5 @@ add_projects( | |
semaphore | ||
thread | ||
timeout | ||
wait_handle | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6 changes: 6 additions & 0 deletions
6
examples/xtd.core.examples/threading/wait_handle/CMakeLists.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
cmake_minimum_required(VERSION 3.5) | ||
|
||
project(wait_handle) | ||
find_package(xtd REQUIRED) | ||
add_sources(README.md src/wait_handle.cpp) | ||
target_type(CONSOLE_APPLICATION) |
31 changes: 31 additions & 0 deletions
31
examples/xtd.core.examples/threading/wait_handle/README.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
# wait_handle | ||
|
||
Shows how to use [xtd::threading::wait_handle](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1threading_1_1wait_handle.html) class. | ||
|
||
## Sources | ||
|
||
[src/wait_handle.cpp](src/wait_handle.cpp) | ||
|
||
[CMakeLists.txt](CMakeLists.txt) | ||
|
||
# Build and run | ||
|
||
Open "Command Prompt" or "Terminal". Navigate to the folder that contains the project and type the following: | ||
|
||
```cmake | ||
xtdc run | ||
``` | ||
|
||
# Output | ||
|
||
``` | ||
MMain thread is waiting for BOTH tasks to complete. | ||
Performing a task for 4000 milliseconds. | ||
Performing a task for 9000 milliseconds. | ||
Both tasks are completed (time waited=00:00:09:011011000) | ||
The main thread is waiting for either task to complete. | ||
Performing a task for 7000 milliseconds. | ||
Performing a task for 4000 milliseconds. | ||
Task 2 finished first (time waited=00:00:04:011925000). | ||
``` |
74 changes: 74 additions & 0 deletions
74
examples/xtd.core.examples/threading/wait_handle/src/wait_handle.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
#include <xtd/threading/auto_reset_event> | ||
//#include <xtd/threading/thread_pool> | ||
#include <xtd/threading/thread> | ||
#include <xtd/console> | ||
#include <xtd/date_time> | ||
#include <xtd/random> | ||
#include <xtd/startup> | ||
|
||
using namespace xtd; | ||
using namespace xtd::threading; | ||
|
||
namespace wait_handle_example { | ||
class program { | ||
public: | ||
static void main() { | ||
// Queue up two tasks on two different threads; | ||
// wait until all tasks are completed. | ||
auto dt = date_time::now(); | ||
console::write_line("Main thread is waiting for BOTH tasks to complete."); | ||
//thread_pool::queue_user_work_item(wait_callback(do_task), event1); | ||
//xthread_pool::queue_user_work_item(wait_callback(do_task), event2); | ||
auto t1 = thread::start_new(parameterized_thread_start {do_task}, &event1); | ||
auto t2 = thread::start_new(parameterized_thread_start {do_task}, &event2); | ||
wait_handle::wait_all({event1, event2}); | ||
// The time shown below should match the longest task. | ||
console::write_line("Both tasks are completed (time waited={0})", | ||
date_time::now() - dt); | ||
|
||
// Queue up two tasks on two different threads; | ||
// wait until any task is completed. | ||
dt = date_time::now(); | ||
console::write_line(); | ||
console::write_line("The main thread is waiting for either task to complete."); | ||
//thread_pool::queue_user_work_item(wait_callback(do_task), event1); | ||
//thread_pool::queue_user_work_item(wait_callback(do_task), event2); | ||
auto t3 = thread::start_new(parameterized_thread_start {do_task}, &event1); | ||
auto t4 = thread::start_new(parameterized_thread_start {do_task}, &event2); | ||
auto index = wait_handle::wait_any({event1, event2}); | ||
// The time shown below should match the shortest task. | ||
console::write_line("Task {0} finished first (time waited={1}).", | ||
index + 1, date_time::now() - dt); | ||
} | ||
|
||
static void do_task(std::any state) { | ||
auto are = as<auto_reset_event*>(state); | ||
auto time = 1000 * r.next(2, 10); | ||
console::write_line("Performing a task for {0} milliseconds.", time); | ||
thread::sleep(time); | ||
are->set(); | ||
} | ||
|
||
private: | ||
// Define two auto_reset_event. | ||
inline static auto_reset_event event1 {false}; | ||
inline static auto_reset_event event2 {false}; | ||
|
||
// Define a random number generator for testing. | ||
inline static xtd::random r; | ||
}; | ||
} | ||
|
||
startup_(wait_handle_example::program); | ||
|
||
// This example produces output similar to the following: | ||
// | ||
// Main thread is waiting for BOTH tasks to complete. | ||
// Performing a task for 4000 milliseconds. | ||
// Performing a task for 9000 milliseconds. | ||
// Both tasks are completed (time waited=00:00:09:011011000) | ||
// | ||
// The main thread is waiting for either task to complete. | ||
// Performing a task for 7000 milliseconds. | ||
// Performing a task for 4000 milliseconds. | ||
// Task 2 finished first (time waited=00:00:04:011925000). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters