Hi Marcus

I first deleted the interrupt in the stop() method but it didn't work.
After that, I read your link and it gave me an idea. I put a try-catch in
the boost::this_thread::sleep function to discover what interruption is
happening, and now, my program works as it should be and no kind of
interruption is thrown.

I'm not sure why but it works.

Thank you.
Regards.
Isaac T.

try{
boost::this_thread::sleep(boost::posix_time::milliseconds(static_cast<long>(d_period_ms)));//
detiene el thread por d_period_ms milisegundos
        } catch (boost::thread_interrupted&) {}

El vie, 9 jul 2021 a las 12:38, Marcus Müller (<mmuel...@gnuradio.org>)
escribió:

> Well, then behaviour is as intended:
>
>
> https://www.boost.org/doc/libs/1_54_0/doc/html/thread/thread_management.html#thread.thread_management.tutorial.interruption
>
> I think you simply might not want to interrupt() the thread here?
>
> Best regards,
> Marcus
>
> On 09.07.21 19:35, isaac mario tupac davila wrote:
> > Hi Marcus
> >
> > I'm setting d_finished = true in the stop() function, like GNU Radio
> message strobe do it:
> >
> > bool
> >     thread_ptr_impl::stop()
> >     {
> >        // Shut down the thread
> >       d_finished = true;
> >       d_thread->interrupt();
> >       d_thread->join();
> >
> >       return block::stop();
> >     }
> >
> > El vie, 9 jul 2021 a las 12:07, Marcus Müller (<mmuel...@gnuradio.org
> > <mailto:mmuel...@gnuradio.org>>) escribió:
> >
> >     Hi Isaac,
> >
> >     where do you set `d_finished = true;`?
> >
> >     On 09.07.21 19:04, isaac mario tupac davila wrote:
> >     > Hello
> >     >
> >     > My name is Isaac . I'm trying to do a message strobe OOT block
> which could read a .txt
> >     > file to define a list of command messages. I created a general
> block and deleted the
> >     > general_work class as messages work in a separate thread.
> >     >
> >     > I literally write the same idea of the message strobe block
> provided by GNU Radio for
> >     > the use of the thread:
> >     >
> >     > bool
> >     >     thread_ptr_impl::start()
> >     >     {
> >     >       // NOTE: d_finished should be something explicitly thread
> safe. But since
> >     >       // nothing breaks on concurrent access, I'll just leave it
> as bool.
> >     >       d_finished = false;
> >     >       d_thread = boost::shared_ptr<gr::thread::thread>
> >     >         (new gr::thread::thread(boost::bind(&thread_ptr_impl::run,
> this)));
> >     >       return block::start();
> >     >     }
> >     >
> >     > void thread_ptr_impl::run()
> >     >     {
> >     >       while(!d_finished) {
> >     >
> >     >
> >
>  
> boost::this_thread::sleep(boost::posix_time::milliseconds(static_cast<long>(d_period_ms)));
> >     >         if(d_finished) {
> >     >           return;
> >     >         }
> >     >         message_port_pub(d_port, d_msg);
> >     >       }
> >     >     }
> >     >
> >     > My problem is that when GNU Radio finishes to wait in the run()
> function
> >     > (boost::this_thread::sleep) , instead of continuing with the
> conditional "if", it
> >     > finishes the programme and it doesn't achieve publish the message.
> >     >
> >     > ¿What could be happening here? ¿Why is this happening here and
> doesn't happen in the GNU
> >     > Radio message strobe? ¿Maybe a configuration in the CMake or I
> have to choose a
> >     > non-general OOT block?
> >     >
> >     > I really appreciate any idea or suggestion.
> >     > Thanks
> >     > Isaac T.
> >     >
> >     >
> >     >
> >     >
> >
>

Reply via email to