$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [Boost-users] [thread] : pause/resume thread
From: Kazz (sfx810_at_[hidden])
Date: 2011-04-15 10:43:11
>inside qthread contructor, copy just the following and you are good to go.
>mThread = new boost::thread(bind(&qthread::Execute, this));
Pardon my ignorance here, but I assume I also have to manually delete the
mThread then ?,if not, when qThread object goes out of scope, who ll remove
it, (or take its ownership) ?
2011/4/15 bit bit <g_rambot_at_[hidden]>
>
> inside qthread contructor, copy just the following and you are good to go.
>
> mThread = new boost::thread(bind(&qthread::Execute, this));
>
> ------------------------------
> Date: Fri, 15 Apr 2011 11:06:56 +0100
> From: sfx810_at_[hidden]
> To: boost-users_at_[hidden]
> Subject: [Boost-users] [thread] : pause/resume thread
>
> Hi All, I have just started learning boost. I want my thread to support
> following functions
> Pause();
> Resume();
> Stop();.
> I have come up with following code, which ends up as dead lock. Can some
> one please guide me as how to achieve the desired functionality.
> Would really appreciate any help.
> Thanks.
> Kaz
> class qthread
> {
> public:
>     boost::thread* mThread;
>     boost::condition_variable mCond;
>     boost::mutex mMutex;
>     bool mExit;
>     qthread(): mExit(false)
>     {
>         // create function pointer to local Execute function
>         boost::function<void (qthread*)> fptr = &qthread::Execute;
>         fptr(this);
>         // pass on function pointer along with this reference to boost
> thread
>         boost::thread th0( fptr, this);
>         // assign temp thread to local variable
>         mThread = &th0;
>     }
>     void Resume()
>     {
>         mMutex.unlock();
>         mCond.notify_all();
>     }
>     void Stop()
>     {
>         mThread->interrupt();
>         mExit = true;
>         Resume();
>     }
>      void Pause()
>     {
>      // todo
>     }
>     virtual void Execute()
>     {
>         std::cout<<"Entering thread Execution"<<std::endl;
>         boost::unique_lock<boost::mutex> lock(mMutex);
>         mCond.notify_all();
>         mCond.wait(lock);       //<< DEAD LOCK
>         int i = 0;
>         while ( !mExit )
>         {
>             try
>             {
>                 while ( 1 )
>                 {
>                     std::cout<<"Executing thread, cycle i =
> "<<++i<<std::endl;
>                     boost::this_thread::interruption_point();
>                 }
>             }
>             catch( boost::thread_interrupted&)
>             {
>                 std::cout<<"thread_interrupt exception"<<std::endl;
>                 mCond.wait(lock);
>             }
>         }
>         std::cout<<"Exiting thread"<<std::endl;
>     }
> };
> //--------------------------
> int main()
> {
>     qthread qt;   ///<<  DEAD LOCK
>     boost::this_thread::sleep(boost::posix_time::seconds(3) );
>     qt.Resume();
>     boost::this_thread::sleep(boost::posix_time::seconds(3) );
>     qt.Stop();
> }
> _______________________________________________ Boost-users mailing list
> Boost-users_at_[hidden]
> http://listarchives.boost.org/mailman/listinfo.cgi/boost-users
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://listarchives.boost.org/mailman/listinfo.cgi/boost-users
>