I designed a simple timeout thrower for a bluetooth protocol I am writing. If the packet is not received in a certain amount of time, then timeout is thrown. I made it to be as plug and play as possible.
timeout.hpp:
#ifndef __timeout_h__
#define __timeout_h__
#include <thread>
struct Timeoutthread{
private:
int sleep;
public:
Timeoutthread(int seconds);
void time(bool* alert);
};
class Timeout{
private:
int sleep;
bool alert;
public:
Timeout(int seconds);
bool timeout();
};
#endif
timeout.cpp:
#include "timeout.hpp"
Timeout::Timeout(int seconds){
sleep = seconds;
Timeoutthread timeoutthread(sleep);
std::thread timeout(&Timeoutthread::time,timeoutthread,&alert);
timeout.detach();
}
bool Timeout::timeout(){
return alert;
}
Timeoutthread::Timeoutthread(int seconds){
sleep = seconds;
}
void Timeoutthread::time(bool* alert){
std::this_thread::sleep_for (std::chrono::seconds(sleep));
*alert = true;
}
simple implementation:
#include <iostream>
#include "timeout.hpp"
int main(){
std::string message = "";
Timeout timeout(10);
while(message == ""){
message = readBLE();
if(timeout.timeout() == true)
message = "timed out";
}
std::cout<<message<<std::endl;
return 0;
}
The loop waits for a bluetooth message, but if no message is received in 10 seconds, then a timeout is thrown.
Is this an efficient way to do it. I want to make sure that I am not wasting any resources.
EDIT:
There seems to be some confusion on the readBLE()
part. There is a lot more code associated with this part but it does not act like std::cin
where it is waiting for a user input. Whenever readBLE()
is called, if there was no message received, then it would just return an empty string. Sorry for the confusion.
(read from bluetooth)
returns in at most ten seconds? \$\endgroup\$steady_clock
. Don't trust some weird sources of info. \$\endgroup\$