gatt-python icon indicating copy to clipboard operation
gatt-python copied to clipboard

Writing to characteristic values from outside the event loop

Open its2loud opened this issue 7 years ago • 12 comments

I'm not sure how to make use of the event loop properly: I would like to use the GATT SDK inside a flask server. When a http request is sent to the server I would like to write a value to a characteristic (by handle). But how can I access the DeviceManager or even start / stop it once it is running forever?

its2loud avatar Jun 21 '17 16:06 its2loud

Run manager.run() in another thread or process, then you can stop it with manager.stop(). If you run it in a thread, it should be easy to access the device class members so you'll be able to use the services/characteristics once they're resolved.

swojo avatar Jun 30 '17 08:06 swojo

Did you actually try that? I did. It works but has some odd side-effects like the thread running the manager then receiving exceptions like ctrl-c and not the main thread anymore.

I think a more detailed example would sure be helpful.

harbaum avatar Jul 06 '17 10:07 harbaum

i tried running it in another thread as well: https://gist.github.com/its2loud/93f65c27c74df8a934067d7c330cef18

unfortunately i wasn't able to stop it then. any idea, what i am doing wrong? an example would be very useful of course.

its2loud avatar Jul 06 '17 11:07 its2loud

Yeah, I tried it and didn't have any problems. @its2loud, I edited your example a little to show you how I did it. The manager.run() function is the blocking one so that's the only thing I ran in the thread. Try this?

https://gist.github.com/swojo/2b9b45cdd3bc744e28f7a2fbe885eace

swojo avatar Jul 06 '17 12:07 swojo

Thanks a lot. But as commented in your example i still see the manager thread receiving the ctrl-c and not the main thread.

harbaum avatar Jul 06 '17 14:07 harbaum

I see this on two different ubuntu x86 machines and on a raspberry pi. On what kind of machin does this work for you?

harbaum avatar Jul 07 '17 07:07 harbaum

As commented below the gist I can't even stop it with Ctrl+C. It takes a few seconds and throws another exception..

its2loud avatar Jul 07 '17 09:07 its2loud

If i replace the call to manager.run() by something trivial like a time.sleep() then the exception handling works as expected. So manager.run() somehow influences all this.

harbaum avatar Jul 07 '17 11:07 harbaum

The closest thing i could come up with is this: https://gist.github.com/harbaum/db0a0928458fefc0793df66a5d377b16

But it e.g. requires the main thread to actively check for the manager thread to be still alive.

Here someone describes exactly the same problem: https://stackoverflow.com/questions/36680667/terminate-gobject-mainloop-threads-together-with-main/36778891 Interestingly he accepts the answer although it doesn't help in this case as the signal handler of the main thread never receives the signal.

harbaum avatar Jul 10 '17 18:07 harbaum

This one also describes the same problem: https://stackoverflow.com/questions/28465611/python-dbusgmainloop-inside-thread-and-try-and-catch-block/28476630 The solution presented there also doesn't really solve the problem but rather works around it.

harbaum avatar Jul 10 '17 18:07 harbaum

@harbaum, can you confirm #28 fixes your issue?

Snevzor avatar Mar 21 '18 10:03 Snevzor

Thank you very much. This solves the Issue. Now ctrl + C does not stop the Device Manager Thread anymore but raises a KeyboardInterrupt in the Main Thread as it is supposed to.

netding avatar Jun 07 '18 22:06 netding