Here's something that I personally would try.
Launch a thread and create Win32::GUI::Timer object. When the timer goes off, have it check to see if the thread is joinable. If it's not, do nothing. If if it is, then you can join the thread and kill the Win32::GUI::Timer object.
However, if you're needing the thread to continue running for a long time and return stuff periodically, you can tweak the above steps so that you're checking on shared variable(s) instead of checking to see if the thread is joinable.