- C# code
{ ... labPK->Text="排课开始"; //新线程 ThreadStart^ ts=gcnew ThreadStart(this,&Form1::Start); t=gcnew Thread(ts); t->Start(); //Start(); //开始排课 //t->Join(); //while(t->IsAlive); t->ThreadState; //if(startstate)//等待线程结束 labPK->Text="完毕!"; ... }private:Void Start() { ... }
我想用一个新的线程来执行这个start()函数,代码如上。我想要的效果是当start()执行玩后再执行下面的语句。可现在的问题是无论是用join还是while(t->isalive)都会出现死循环的情况,在start()中我有用到修改窗体的lable的text属性我用了下面这个办法;
- C# code
delegate void SetTextCallback(String^ text);private: void SetText(String^ text) { // InvokeRequired required compares the thread ID of the // calling thread to the thread ID of the creating thread. // If these threads are different, it returns true. if (labPK->InvokeRequired) { SetTextCallback^ d = gcnew SetTextCallback(this,&Form1::SetText); labPK->Invoke(d, gcnew array<Object^>{ text }); } else { labPK->Text = text; } }//设置进度条 delegate void Setpb(int value); private:Void SetpbPK(int value) { if(value<=pbPK->Maximum) if(pbPK->InvokeRequired) { Setpb ^pb=gcnew Setpb(this,&Form1::SetpbPK); pbPK->Invoke(pb,gcnew array<Object^>{ value }); } else { pbPK->Value++; } }
可问题就出在invoke这儿,程序运行到invoke就死了、。如果去掉t->join()的话,invoke就不会有问题,但会先执行if里的语句接着又执行一遍else中的语句,但我只调用了一次setText();我是初学者也不知道这是什么意思。
我现在想用join来控制执行的顺序但在invoke这儿又出现问题。望大哥帮忙!!
------解决方案--------------------------------------------------------
帮楼主顶,打算学C#,但是还没有开始
------解决方案--------------------------------------------------------
帮楼主顶,顺便说一下,这是C++ Code,楼主要选择正确!
------解决方案--------------------------------------------------------
start 代码
还有你用join无法精确控制
考虑用异步调用