Skip to content

Commit dab215d

Browse files
committed
first
0 parents  commit dab215d

File tree

3 files changed

+126
-0
lines changed

3 files changed

+126
-0
lines changed

README.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# SYNOPSIS
2+
Simple timeouts for C++
3+
4+
# USAGE
5+
6+
## CONSTRUCTOR
7+
```cpp
8+
Timeout t;
9+
```
10+
11+
## METHODS
12+
13+
### set(lambda cb, int n)
14+
Set a timeout for n milliseconds
15+
16+
```cpp
17+
t.set([]() {
18+
cout << "ok, done";
19+
}, 100 * 10);
20+
```
21+
22+
### sleep(int n)
23+
Go to sleep n for milliseconds
24+
25+
```cpp
26+
t.sleep(100);
27+
```
28+
29+
### clear()
30+
Clear a timeout that has been set.
31+
32+
```cpp
33+
t.clear();
34+
```
35+

index.h

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#ifndef TIMEOUT_H
2+
#define TIMEOUT_H
3+
4+
#include <mutex>
5+
#include <thread>
6+
7+
class Timeout {
8+
9+
typedef std::function<void()> Callback;
10+
11+
Callback callback;
12+
13+
class {
14+
15+
bool clear = false;
16+
struct escape {};
17+
18+
std::mutex mu;
19+
std::condition_variable con;
20+
21+
public:
22+
23+
void cancel() {
24+
std::unique_lock<std::mutex> lock(mu);
25+
clear = true;
26+
con.notify_all();
27+
}
28+
29+
void wait(int i) {
30+
31+
auto period = std::chrono::milliseconds(i);
32+
auto timedout = std::cv_status::no_timeout;
33+
34+
std::unique_lock<std::mutex> lock(mu);
35+
36+
if (clear || con.wait_for(lock, period) == timedout) {
37+
clear = false;
38+
throw escape();
39+
}
40+
}
41+
} clearable;
42+
43+
int ms = 0;
44+
int counter = 0;
45+
46+
std::unique_ptr<std::thread> th;
47+
48+
void loop() {
49+
try {
50+
while (true) {
51+
if (++counter == ms) {
52+
clearable.cancel();
53+
callback();
54+
}
55+
clearable.wait(1);
56+
}
57+
} catch (...) {
58+
return;
59+
}
60+
}
61+
62+
public:
63+
void set(Callback cb, int i) {
64+
callback = cb;
65+
ms = i;
66+
67+
auto fn = std::bind(&Timeout::loop, this);
68+
auto t = new std::thread(fn);
69+
70+
th = std::unique_ptr<std::thread>(t);
71+
}
72+
73+
void clear() {
74+
clearable.cancel();
75+
th->join();
76+
}
77+
78+
void sleep(int n) {
79+
auto ms = std::chrono::milliseconds(n);
80+
std::this_thread::sleep_for(ms);
81+
}
82+
};
83+
84+
#endif
85+

package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "timeout",
3+
"verison": "1.0.0",
4+
"description": "timeout functions",
5+
"url": "//github.com/hij1nx/cpp-timeout"
6+
}

0 commit comments

Comments
 (0)