问题描述
我在写一个winform程序,点button1会循环调用别的project的程序,运行大约几分钟,现在想要加一个button2,终止button1的程序运行,多线程应该可以解决这个问题。。我已经尝试用上thread,不过结果不好,代码太多,不贴上来了,大概就是这个样子:privateThreadthreadtest;privatedelegatevoidDelegatetest(objectobjTest,stringstrMethod);privateDelegatetestdelegatetest;button1事件{delegatetest=newDelegatetest(invokemethod);threadtest=newThread(newThreadStart(run));threadtest.Start();//后续的代码//……}run(){//invoke另一个project的方法}但是现在的问题是,thread.start()以后,程序并不运行thread之中的方法,而是把后续的代码都运行完之后才开始运行thread之中的方法,于是我加上了threadtest.join(),但是程序运行到join这一行之后,就没有反应了,在vs里点一下暂停,也一直停留在join这行,是不是我理解有误?怎么样才可以实现不点stop就像没有加thread一样顺利运行完程序,点了stop就终止线程,然后执行后续的代码?
解决方案
解决方案二:
通过一个标识变量flagbutton1的线程run()如下voidrun(){while(flag){//...其他}}点button1把flag置true并启动线程点button2把flag置false,当本轮循环执行完成,就退出循环,然后线程就结束了
解决方案三:
SLEEP()?线程优先级?
解决方案四:
我也想了解这方面的内容
解决方案五:
可以使用信号量,获得信号量的线程运行,没有获得信号量的线程等待。
解决方案六:
引用4楼zhaojiangjing的回复:
可以使用信号量,获得信号量的线程运行,没有获得信号量的线程等待。
是什么意思?
解决方案七:
虽然现在已经按照别的方法做这件事,但是我还是想问问多线程究竟是什么意思?跪求大仙指点一二。。
解决方案八:
//中间加句申明为后台线程,你的死循环放前台不死机已经不错了threadtest=newThread(newThreadStart(run));threadtest.IsBackground=true;//这句threadtest.Start();
解决方案九:
1、把后续代码封装成一个方法func1();2、button2点击事件执行threadtest.Stop();func1();3、如果你还有个暂停按钮button3,则在暂停时执行threadtest.Suspend();继续时执行threadtest.Resume();而且还应在threadtest执行结束时回调func1