C#线程暂停与继续解决方案

昨天, 老师要我们每个人交一个关于黑客方面的程序,想了半天发现端口扫描工具好像好写点,从昨天写到今天基本快完成了,给大家看下效果,不要笑话我哦哦(~~)

图1 端口扫描器

这个程序里面有一些地方不太满意,就是扫描的暂停与继续实现时,使用的是Thread.Suspend和Thread.Resume而这两个方法,在VS2010里提示已经过时,不建议使用,在网上查阅了一些资料,发现有个事件通知的方法很好,事件通知的大致原理是,线程在执行过程中暂停,等到其他线程通知时才继续执行下去,这样的确是可以起到暂停与继续的效果。但是,这种暂停是被动的,我需要的是主动暂停,即点下按钮,线程暂停,再点下按钮,线程继续执行。

最终,我想了一种比较另类的方法,大致思路如下:还是采用事件通知的方式,在线程中等待通知,直到来通知了才继续执行,而主线程(窗体线程)中使用一个计时器System.Windows.Forms.Timer 来不停的通知线程,如果计时器间隔时间设置的足够小,基本上看不出停顿。此时,程序的暂停与继续实现就很简单了,相信大家已经想到了,只要在通过控制计时器的Stop()和Start()就可控制线程的暂停与继续了。

下面是一个下的demo:

运行截图:

图2 demo运行效果

C#源代码:

usingSystem;

usingSystem.Windows.Forms;

usingSystem.Threading;

namespace线程暂停与继续实现

{

publicpartialclassForm1 : Form

{

//计时器

privateSystem.Windows.Forms.Timer tm =newSystem.Windows.Forms.Timer();

//自动重置事件类

//主要用到其两个方法 WaitOne() 和 Set() , 前者阻塞当前线程,后者通知阻塞线程继续往下执行

AutoResetEvent autoEvent = newAutoResetEvent(false);

publicForm1()

{

InitializeComponent();

ProgressBar.CheckForIllegalCrossThreadCalls = false;

tm.Interval = 1;

tm.Tick += newEventHandler(tm_Tick);

}

//计时器 事件

voidtm_Tick(objectsender, EventArgs e)

{

autoEvent.Set(); //通知阻塞的线程继续执行

}

//启动

privatevoidbtnStart_Click(objectsender, EventArgs e)

{

tm.Start();

Thread t = newThread(DoWork);

t.Start();

}

//在线程中执行的方法

privatevoidDoWork()

{

while(progressBar1.Value < progressBar1.Maximum)

{

progressBar1.PerformStep();

autoEvent.WaitOne(); //阻塞当前线程,等待通知以继续执行

}

}

//暂停

privatevoidbtnSuspend_Click(objectsender, EventArgs e)

{

tm.Stop();

}

//继续

privatevoidbtnResume_Click(objectsender, EventArgs e)

{

tm.Start();

}

}

}

python线程的暂停与继续_线程暂停与继续实现相关推荐

  1. python在主线程上下文执行_线程进程系列*(Python)

    一 ,线程的两种调用方式 threading 模块建立在thread 模块之上.thread模块以低级.原始的方式来处理和控制线程,而threading 模块通过对thread进行二次封装, 提供了更 ...

  2. java 线程的创建和执行_线程管理(一)线程的创建和运行

    声明:本文是< Java 7 Concurrency Cookbook>的第一章, 作者: Javier Fernández González 译者:郑玉婷 校对:欧振聪 线程的创建和运行 ...

  3. Linux_多线程(进程与线程的联系_pthread库_线程创建_线程等待_线程正常终止_线程取消_线程分离_pthread_t与LWP)

    文章目录 1.线程的定义,进程和线程的关系 2.Linux下的线程 Linux原生线程库(pthread库pthread.h) 线程的优点 线程的私有数据 3.线程控制 ①创建线程(pthread_c ...

  4. java线程暂停和继续_线程暂停和恢复

    一个线程,在无限的循环,当有数据的时候就会被处理掉,但是如果暂时还没有数据,我们也会迭代判断有没有数据.这样就造成了浪费.我们可以让没有数据的时候暂停这个线程,当有数据进来的时候再通知线程运行,如果线 ...

  5. java 线程安全的单例_线程安全的单例模式的几种实现

    单例模式是常见的设计模式之一:目的是节省内存,限制了实例的个数:有利于java GC回收机制. 单例模式的三个好处: 1.控制资源的使用,通过线程同步来控制资源的并发访问 2.控制实例的产生个数,来达 ...

  6. python强制暂停线程_如何暂停线程(python)

    上下文: 我正在用Qt creator和python中的"behavior"文件构建一个图形界面.我的GUI的测试版本是: 预期行为: 我正在运行两个不同的线程,它们被引用到同一个 ...

  7. python qthread 线程退出_线程:概念和实现

    翻译:老齐 译者注:与本文相关图书推荐:<Python大学实用教程><跟老齐学Python:轻松入门> ★ 本文将分两部分刊发. " 第一部分 Python线程允许程 ...

  8. python线程安全_线程,线程安全与python的GIL锁

    在看的过程中,接触到一个名词,一个从学python开始就一直看到,但是从来都是一知半解的名词,心里不开心,必须把它搞明白,对了,这个词就是 GIL.网上搜索了一些资料,粗浅的理解了什么是GIL,自己感 ...

  9. 线程中这么调用类_一文学会 Python 多线程编程

    Threading 模块从Python 1.5.2版开始出现,用于增强底层的多线程模块 thread .Threading 模块让操作多线程变得更简单,并且支持程序同时运行多个操作. 注意,Pytho ...

最新文章

  1. Java中图形界面重绘方法
  2. SpringBoot+Vue实现请求后台获取Base64编码的图片验证码并使用Redis缓存实现2分钟内有效
  3. bnu 4067 美丽的花环
  4. 从循环引用谈依赖倒置原则
  5. 【校招面试 之 C/C++】第12题 C++ 重载、重写和重定义
  6. sqlserver获得到当前游标中存在的数据行数
  7. android 线程太多,应用程序可能在其主线程上做了太多的工作。
  8. 图片服务 - thumbor自定义检测
  9. numpy where
  10. @广州开发者,华为送来一份说明书——助你轻松应对开发难题
  11. ngram模型中文语料实验step by step(3)-ngram模型的光滑处理
  12. NO5 grep-head-tail命令
  13. C/c++输入输出函数
  14. 05.日志框架与Spring Boot日志全篇
  15. pdf复制文字时对于回车的处理
  16. 嵌入式linux应用开发之常用shell脚本总结
  17. 计算机与机械制图课题研究,考核机械制图论文,关于“机械制图CAD”课程考试改革相关参考文献资料-免费论文范文...
  18. 快速获取InputBox选中区域的单个单元格引用地址
  19. mysql建库图解_数据库 MySQL安装图解
  20. 小程序中新版本的获取用户头像与昵称:bind:chooseavatar

热门文章

  1. kmplayer 调左右声道
  2. Reset your Rearm count, run Windows 7 Forever without cracks
  3. html中留言表怎么写,html 留言板:
  4. 李东生增持TCL集团191万股份 占总股本0.02%
  5. CSS 手写加号和减号
  6. linux开机直接进入win,安装ubuntu之后直接进入windows系统的一种原因
  7. win10/win11开机自动连接指定WiFi - 任务计划运行bat脚本
  8. cineam 4d 影视特效制作-多米诺骨牌效应动画
  9. PTA-测试-Java-5-1 厘米换算英尺英寸 (15分)
  10. 51单片机测电压,QT串口接收,并用数码管显示,十六进制转十进制