我写的程序在界面上有三个按钮,开始、暂停、停止
在点击开始按钮后开始一个线程,我想点击暂停后就使线程暂停,但是用Suspend()和Resume()提示已经过时,在网上搜了很多解答,都不好。很多用的是ManualResetEvent中的WaitOne()和Set(),但是它只能是在固定的一个点暂停下来,而不能在按下暂停按钮的时刻线程完成了多少就在完成出暂停。
请问怎么解决?
大概代码结构如下:public partial class L3
{
//新的的线程
private Thread thread; public L3()
{
//线程初始化
thread = new Thread(new ThreadStart(ProcessSites));
} //点击开始按钮
private void pictureBox_start_Click(object sender, EventArgs e)
{
if (是暂停状态)
恢复执行; //怎么写?
else
thread.Start();
} //点击暂停按钮
private void pictureBox_pause_Click(object sender, EventArgs e)
{
//怎么写?
} //点击停止按钮
private void pictureBox_stop_Click(object sender, EventArgs e)
{
thread.Abord();
}
//新线程调用的函数
private void ProcessSites()
{
code...;
code...;
}
}
}
在点击开始按钮后开始一个线程,我想点击暂停后就使线程暂停,但是用Suspend()和Resume()提示已经过时,在网上搜了很多解答,都不好。很多用的是ManualResetEvent中的WaitOne()和Set(),但是它只能是在固定的一个点暂停下来,而不能在按下暂停按钮的时刻线程完成了多少就在完成出暂停。
请问怎么解决?
大概代码结构如下:public partial class L3
{
//新的的线程
private Thread thread; public L3()
{
//线程初始化
thread = new Thread(new ThreadStart(ProcessSites));
} //点击开始按钮
private void pictureBox_start_Click(object sender, EventArgs e)
{
if (是暂停状态)
恢复执行; //怎么写?
else
thread.Start();
} //点击暂停按钮
private void pictureBox_pause_Click(object sender, EventArgs e)
{
//怎么写?
} //点击停止按钮
private void pictureBox_stop_Click(object sender, EventArgs e)
{
thread.Abord();
}
//新线程调用的函数
private void ProcessSites()
{
code...;
code...;
}
}
}
就是说比如一个thread调用的函数是Process
ManualResetEvent mre = new ManualResetEvent(false);
void Process()
{
code...;
mre.WaitOne();
code...;
code...;
}
这样的话只会在执行完第二行代码后暂停。但是我想要的是:在点击暂停时,如果此时刚好执行完第一条代码,那就在第二条代码执行之前暂停;如果此时刚好执行完第二条代码,那就在第三条代码执行之前暂停。
在pictureBox_pause_Click的时候判断这个全局变量的值,然后再thread.Suspend();
所以不是很好,建议用线程池来改写.
唉。
我最近也做了一个多线程的模块,我建议是,点击按钮后提示“正在暂停线程...”,等各个一个线程执行的函数完毕后,再提示“线程已经停止!”。这样才算是安全的暂停了线程!