我在主窗体程序中新建了个线程想去执行主程序中一个函数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();
没用这东西吗?我还以为你都会了。