Thank you for the pointer to use QThread::currentThread for debugging! The problem was a bit more obscure than I was thinking, but that tip led me to the solution: the function that *called* the function which tried to start the timer was a VLC callback. Apparently, that callback was running in a different thread, so when it called my function *directly*, my function was also running in a different thread. By having the callback instead emit a signal which I connected to my function, my function ran in the correct thread, and I was able to start the timer properly (hopefully that all makes sense).
Thanks again! --- Israel Brewster Software Engineer Alaska Volcano Observatory Geophysical Institute - UAF 2156 Koyukuk Drive Fairbanks AK 99775-7320 Work: 907-474-5172 cell: 907-328-9145 > On Jul 18, 2021, at 8:48 PM, Nuno Santos <nuno.san...@imaginando.pt> wrote: > > Israel, > > Maybe the problem is that fact that you call worker initVLC(videoWin) from > the main thread. > > Maybe you could connect a signal to the thread started signal to call initVLC. > > Try to debug QThread::currentThread() when initVLC is called and when worker > is created to see if what I say makes sense. > > Best, > > Nuno > >> On 19 Jul 2021, at 04:29, Israel Brewster <ijbrews...@alaska.edu >> <mailto:ijbrews...@alaska.edu>> wrote: >> >> Yes, this is a FAQ, but I can’t seem to figure out what I am doing wrong. I >> am using the worker pattern of QThread, (as opposed to subclassing), running >> Qt 5.15.2. In my controller’s constructor, I have the following code to >> initialize a worker: >> >> worker=new VLCWorker(); >> worker->moveToThread(&vlcWorkerThread); >> worker->initVLC(videoWin); >> vlcWorkerThread.start(); >> >> The initVLC function, among other things, creates a timer and connects it to >> a slot in the worker: >> >> rtspStartTimer=new QTimer; >> rtspStartTimer->setSingleShot(true); >> connect(rtspStartTimer, &QTimer::timeout, >> this, &VLCWorker::rtspStarting); >> >> >> Later, at some point during program execution, I try to start this timer >> from a function in the worker (which itself was triggered by a signal from >> the main thread): >> >> qDebug()<<"*****Trying to start timer which lives in >> thread"<<(long)rtspStartTimer->thread()<<" from thread >> "<<(long)this->thread(); >> rtspStartTimer->start(250); >> qDebug()<<"*****Timer attempt complete"; >> >> Unfortunately, this doesn’t work, giving me the following output: >> >> Debug: 2021-07-18T19:26:12.009 - *****Trying to start timer which lives in >> thread 140235980165688 from thread 140235980165688 >> (../DoorBellCamC/vlccontroller.cpp:121, void VLCWorker::rtspStarting()) >> Warning: 2021-07-18T19:26:12.009 - QObject::startTimer: Timers cannot be >> started from another thread (:0, ) >> Debug: 2021-07-18T19:26:12.009 - *****Timer attempt complete >> (../DoorBellCamC/vlccontroller.cpp:123, void VLCWorker::rtspStarting()) >> >> So even though the output of the debug confirms that the timer lives in the >> same thread I am trying to call start from, I still get the error about >> “timers cannot be started from another thread”. What am I doing wrong? >> --- >> Israel Brewster >> Software Engineer >> Alaska Volcano Observatory >> Geophysical Institute - UAF >> 2156 Koyukuk Drive >> Fairbanks AK 99775-7320 >> Work: 907-474-5172 >> cell: 907-328-9145 >> >> _______________________________________________ >> Interest mailing list >> Interest@qt-project.org <mailto:Interest@qt-project.org> >> https://lists.qt-project.org/listinfo/interest >
_______________________________________________ Interest mailing list Interest@qt-project.org https://lists.qt-project.org/listinfo/interest