当前位置: 代码迷 >> VC >> 关于多线程的有关问题
  详细解决方案

关于多线程的有关问题

热度:3079   发布时间:2013-02-25 00:00:00.0
关于多线程的问题!
我在主窗体程序中新建了个线程想去执行主程序中一个函数Fun(),现在的问题是这个新线程是和主程序并发执行的怎么能控制在start执行玩了之后才执行下面的操作呢?
代码如下:
C/C++ code
//新线程            ThreadStart^ ts=gcnew ThreadStart(this,&Form1::Fun);            Thread^ t=gcnew Thread(ts);            t->Start();            //t->Join();            //while(t->IsAlive);            t->ThreadState;            //if(startstate)//等待线程结束            labPK->Text="完毕!";


我用了while(t->IsAlive);会出现死循环的情况,join也是不行?请问怎么才能在上面的Fun的进程执行玩之后才执行下面的操作呢?

------解决方案--------------------------------------------------------
用join是没问题的,join是知道线程终止才执行下面
------解决方案--------------------------------------------------------
C# code
delegate void SetTextCallback(String^ text);private: void SetText(String^ text){   labPK->Text = text;}private: void InvokeSetText(String^ text){   SetTextCallback^ d = gcnew SetTextCallback(this,&Form1::SetText);   labPK->Invoke(d, gcnew array<Object^>{ text });}
------解决方案--------------------------------------------------------
while(t-> IsAlive)
{
Thread::Sleep( 10 ) ;
}
------解决方案--------------------------------------------------------
不用Join,你可以用ManualResetEvent例:
C# code
    ManualResetEvent^ manualEvent = gcnew ManualResetEvent(false);    ParameterizedThreadStart^ ts=gcnew ParameterizedThreadStart(this,&Form1::Fun);    Thread^ t=gcnew Thread(ts);    t->Start(manualEvent);    manualEvent->WaitOne();//等待线程结束    labPK->Text="完毕!";//在函数Fun里在返回前执行下面的操作:manualEvent->Set();
------解决方案--------------------------------------------------------
你的Fun函数得改改,写成Fun(Object^ state)
在函数内部把state强转为ManualResetEvent例:
ManualResetEvent^ event = (ManualResetEvent^)state;
在函数返回前event->Set();
没用这东西吗?我还以为你都会了。
  相关解决方案